我正在创建和设置XML文件样式,并且在尝试为祖先内部的元素赋予编号时遇到问题。我正在处理的XML的等效代码是:
<A>
<B>
<C>
<D>Text 1</D>
<D>Text 2</D>
<D>Text 3</D>
</C>
</B>
<B>
<C>
<D>Text 4</D>
<D>Text 5</D>
</C>
</B>
</A>
<A>
<B>
<C>
<D>Text 6</D>
<D>Text 7</D>
<D>Text 8</D>
</C>
</B>
</A>
必须在每个“A”上重新开始编号,为此,我试图将每个“D”的位置放在其“A”祖先中。
我尝试使用类似count(preceding-sibling::D)+1
的表达式,但编号会在每个“C”元素上重新开始。我也尝试使用count(preceding::D)+1
,但它不起作用,因为它选择了文档中所有以前的“D”元素。
结果应该是:
- 文本1和6 - &gt;位置1
- 文本2和7 - &gt;位置2
- 文本3和8 - &gt;位置3
- 文本4 - &gt;位置4
- 文本5 - &gt;位置5
我怎么能只计算每个“A”的前面“D”元素?
答案 0 :(得分:1)
如果结构与你的例子建议一样规则(即Ds总是在B里面的C里面)那么你可以使用像
这样的东西count(preceding-sibling::D) + count(ancestor::B/preceding-sibling::B//D) + 1
(当前C中此前一个Ds的Ds加上同一A中所有前面Bs中的总数)。
如果不是那么规律,你可以使用“差异”方法:
count(preceding::D) - count(ancestor::A/preceding::D) + 1
(文档中任意位置之前的Ds总数减去当前A之前的数字)。
答案 1 :(得分:0)
我认为你正在寻找祖先,而不是先前兄弟。
答案 2 :(得分:0)
使用更简单的xsl:number ...
,而不是使用count()
<xsl:number from="A" level="any"/>
使用XML输入的示例...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="D">
<xsl:value-of select="."/>
<xsl:text> --> </xsl:text>
<xsl:number from="A" level="any"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
Text 1 --> 1
Text 2 --> 2
Text 3 --> 3
Text 4 --> 4
Text 5 --> 5
Text 6 --> 1
Text 7 --> 2
Text 8 --> 3