XSL对子树内的节点进行计数

时间:2014-01-16 17:08:24

标签: xml xslt xpath

给出以下XML

<?xml version="1.0"?><?xml-stylesheet type="text/xsl"?>

<root>

<hi>
<hello-world><greeter> a </greeter><greeter> b </greeter></hello-world>
<hello-world><greeter> c </greeter><greeter> d </greeter></hello-world> 
</hi>

<hi>
<hello-world><greeter> e </greeter><greeter> f </greeter></hello-world>
<hello-world><greeter> g </greeter><greeter> h </greeter></hello-world>
</hi>

</root>

我循环遍历 hi 子树中的每个 greeter 元素,我需要输出包含 hi 的元素的位置节点

到目前为止,我有这个XSL:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="hi">

<xsl:for-each select="hello-world" >
<xsl:for-each select="greeter" >
   <xsl:value-of select="concat('+',count(ancestor::hi//greeter))" />
</xsl:for-each >
</xsl:for-each >

</xsl:template>

</xsl:stylesheet>

但是这会输出:

+4+4+4+4
+4+4+4+4

我需要:

+1+2+3+4
+1+2+3+4

我尝试了祖先:: hi // greeter 祖先:: hi // preceding :: greeter 祖先:: hi //前 - sibling :: greeter 等无济于事。

我怎样才能做到这一点?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

你犯的错误是你上升到祖父母的水平,并从那里算孙子。无论哪个孙子问,这个数字总是一样的。

尝试改为:

<xsl:template match="/">
<xsl:for-each select="root/hi/hello-world/greeter" >
    <xsl:text>+</xsl:text>
    <xsl:number from="hi" level="any"/>
</xsl:for-each >
</xsl:template>

根据您想要的输出类型,您需要添加包装元素或分隔符。