Использование XPath для извлечения подстроки после определенного текста - PullRequest
1 голос
/ 16 июня 2011

У меня есть XML-документ с несколькими узлами, который выглядит примерно так:

    <Result>
        <Url>http://www.mysite.com/Topic/1/</Url>
    </Result>
    <Result>
        <Url>http://www.mysite.com/Topic/2/</Url>
    </Result>
    <Result>
        <Url>http://www.mysite.com/Topic/3/</Url>
    </Result>

Я хочу получить идентификатор темы после "Topic /" для всех узлов.Для приведенного выше примера я ищу значения 1,2 и 3. Я могу придумать другие способы сделать это, но мне было интересно, есть ли способ сделать это с помощью XPath?

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

Вы можете использовать substring-after в сочетании с substring-before, чтобы просто извлечь число

Это выражение

substring-before(substring-after(.,'http://www.mysite.com/Topic/'),'/')

С учетом вашего ввода (я добавил корневой узел, чтобы сделать его vaild)

<xml>
  <Result>
    <Url>http://www.mysite.com/Topic/1/</Url>
  </Result>
  <Result>
    <Url>http://www.mysite.com/Topic/2/</Url>
  </Result>
  <Result>
    <Url>http://www.mysite.com/Topic/3/</Url>
  </Result>
</xml>

это преобразование иллюстрирует желаемый результат

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml"/>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="Url">
    <Topic>
      <xsl:value-of select="substring-before(substring-after(.,'http://www.mysite.com/Topic/'),'/')"/>
    </Topic>
  </xsl:template>
</xsl:stylesheet>

Выход

<xml>
  <Result>
    <Topic>1</Topic>
  </Result>
  <Result>
    <Topic>2</Topic>
  </Result>
  <Result>
    <Topic>3</Topic>
  </Result>
</xml>

В зависимости от контекста, вы должны заменить . в приведенном выше выражении на путь, необходимый для доступа к вашему узлу.

0 голосов
/ 16 июня 2011

Используйте строковую функцию substring-after, например, так:

substring-after(string(.),'http://www.mysite.com/Topic/')

Это вернет 1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...