使用XPath在特定文本后检索子字符串

时间:2011-06-16 16:34:48

标签: xml xpath

我有一个包含多个节点的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>

我想要做的是在所有节点的“主题/”之后检索主题ID。对于上面的示例,我正在寻找值1,2和3.我可以想到其他方法,但我想知道是否有办法使用XPath吗?

2 个答案:

答案 0 :(得分:2)

您可以使用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>

根据上下文,您应该将上面表达式中的.替换为访问节点所需的路径。

答案 1 :(得分:0)

使用字符串函数substring-after,如下所示:

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

这将返回1/