我正在创建一个遍历所有Xml文件子项的递归XSLT函数..
<xsl:call-template name="testing">
<xsl:with-param name="root" select="ItemSet"></xsl:with-param>
</xsl:call-template>
在运行XSLT时,我需要获取变量根节点值,我在哪里
因为在调用根变量时,我得到了包含所有子节点的节点,但我只需要节点的单个值,并且因为它是递归的,所以我不能对子节点标签起作用,因为它总是会改变。那么如何在任何时候获得变量单个特定值?
$root
和" . "
都不起作用。
XSL代码:
<xsl:variable name="trial" select="count(./*)"></xsl:variable>
<xsl:choose>
<xsl:when test="count(./*) = 0">
:<xsl:value-of select="$root" /> <br/>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="./*">
<xsl:call-template name="testing">
<xsl:with-param name="root" select=".">
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
XML代码:
<ItemSet>
<Item>
1
<iteml1>
1.1
</iteml1>
<iteml1>
1.2
</iteml1>
</Item>
<Item>
2
<iteml1>
2.1
<iteml2>
2.1.1
</iteml2>
</iteml1>
</Item>
</ItemSet>
如果作为代码行代替 * 应该怎么做,所以解决方案会显示:
1
1: 1.1 :
1: 1.2
2
2: 2.1
2: 2.1: 2.1.2
答案 0 :(得分:0)
您有两种选择:如果只在一个地方使用,您可以在样式表根目录中创建一个变量并全局使用。
否则,您需要做的是有两个参数,其中一个参数与每个调用完全相同,因此调用<xsl:with-param name="root" select="." />
时,您还需要添加<xsl:with-param name="baseroot" select="$baseroot" />
并定义<xsl:param name="baseroot" select="$root" />
正好位于<xsl:param name="root" />
之下。然后,您可以使用$ baseroot代替$ root,只需要在堆栈顶部传递的原始值。
答案 1 :(得分:0)
可以有效地实现所需的处理,而无需显式递归:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="*[parent::*]">
<xsl:param name="pPath"/>
<xsl:value-of select="$pPath"/>
<xsl:variable name="vValue" select=
"normalize-space(text()[1])"/>
<xsl:value-of select="$vValue"/> <br/>
<xsl:apply-templates select="*">
<xsl:with-param name="pPath" select=
"concat($pPath, $vValue, ': ')"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<ItemSet>
<Item>
1
<iteml1>
1.1
</iteml1>
<iteml1>
1.2
</iteml1>
</Item>
<Item>
2
<iteml1>
2.1
<iteml2>
2.1.1
</iteml2>
</iteml1>
</Item>
</ItemSet>
生成了想要的结果:
1<br/>1: 1.1<br/>1: 1.2<br/>2<br/>2: 2.1<br/>2: 2.1: 2.1.1<br/>
,并在浏览器中显示为:
1
1:1.1
1:1.2
2
2:2.1第2:2.1:2.1.1