我试图使用通用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的值。任何人都可以指出我在这里做错了什么?
干杯!
答案 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>