下一个元素名称

时间:2016-07-18 15:58:08

标签: xml xslt xpath

我试图使用通用Xpath和通用XSL获取下一个元素名称的名称。但是无法获得元素的名称。

输入1:

<test>
 <userId>we</userId>
 <userId1>
 <testy:tool/>
 </userId1>
</test>

输入2:

<test>
 <userId>we</userId>
 <userId1>
 <testy:hammer/>
 </userId1>
</test>

我正在使用的Xsl:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0"
    >
    <xsl:template match="operationName">

        <xsl:value-of select="local-name(/test/userId1)"/>
        <xsl:apply-templates select="local-name(/test/userId1)" mode="next"/>

    </xsl:template>

    <xsl:template match="testy" mode="next">
        <xsl:value-of select="(following::testy | descendant::testy)[1]"/>
    </xsl:template>

</xsl:stylesheet>

但是这总是显示UserID的值。任何人都可以指出我在这里做错了什么?

干杯!

1 个答案:

答案 0 :(得分:2)

如您所示,您的XSLT没有与任何输入XML元素匹配的模板。所以它最终使用default template。实际上,这会输出文档中所有文本值的串联,即we

我猜你想输出相对于userId1元素的下一个(后代,兄弟或其他)元素的名称。一些更接近你想要的XSLT是:

<xsl:stylesheet
    xmlns:testy="http://example.testy.com"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">

    <xsl:template match="/">
        <xsl:apply-templates select="/test/userId1" mode="next"/>
    </xsl:template>

    <xsl:template match="userId1" mode="next">
        <xsl:value-of select="name((following::testy:* | descendant::testy:*)[1])"/>
    </xsl:template>

</xsl:stylesheet>

为了使其正常工作,您需要修改输入,使其在命名空间方面具有良好的形式:

<test xmlns:testy="http://example.testy.com">
  <userId>we</userId>
  <userId1>
    <testy:tool/>
  </userId1>
</test>