使用Xpath提取字符串的中间部分

时间:2014-01-25 04:55:32

标签: xml xslt xpath

我有一个包含多个元素的XML文件。我正在使用XSLT将每个转换为唯一的XML文件。每个都有一个我想在文件名中使用的id属性,我正在尝试清理属性值。 ids都以capi_开头,有些以_output结尾,因此格式为capi_xxx_yyy_output或capi_xxx_yyy。

我可以在capi _:

之后提取字符串
  <xsl:for-each select="//section">
       <xsl:variable name="cleanId" select="substring-after(@id, '_')" />

从这个新字符串开始,如何在_output之前获取字符串?我试过这个,但它不起作用:

<xsl:for-each select="//section">
       <xsl:variable name="cleanId" select="substring-before(substring-after(@id, '_'), '_output')" />

提前致谢。

2 个答案:

答案 0 :(得分:1)

  

我尝试了这个,但它不起作用:

     

<xsl:for-each select="//section"> <xsl:variable name="cleanId" select="substring-before(substring-after(@id, '_'), '_output')" />

当id以“_output”结尾时,它会起作用;它没有停止工作。所以只要确保它始终如此:

<xsl:variable name="cleanId" select="substring-before(substring-after(concat(@id, '_output'), '_'), '_output')" />

答案 1 :(得分:0)

您的语法看起来不错,您可能只需要实现<xsl:choose>

<xsl:variable name="cleanId">
    <xsl:for-each select="//section">
        <xsl:choose>
        <xsl:when test="contains(@id,'_output')">
            <xsl:value-of select="substring-before(substring-after(@id, '_'), '_output')" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="substring-after(@id, '_')" />
        </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:variable>