在 XPath 或 XSLT 中需要您的帮助。
我对他们两个都很陌生,但是现在我必须解决一个听起来很简单的案例,但经过这么多尝试后,我很难解决:)
我有以下(简化)XML。
首先,“ clean ”一个:
<root>
<a>
<a1>
<a11>
<x1>111</x1>
<x2>222</x2>
<x3>333</x3>
</a11>
</a1>
</a>
<b>
<b1>
<b11>
<b111>
<x2>777</x2>
<x3>888</x3>
</b111>
</b11>
</b1>
</b>
</root>
第二个是相同的XML,但附加了“逻辑” ID号。这些ID有助于以后交叉检查结果,它们在XML中实际上不存在。
<root>
1 <a>
1 <a1>
1 <a11>
1 <x1>111</x1>
2 <x2>222</x2>
3 <x3>333</x3>
</a11>
</a1>
</a>
2 <b>
1 <b1>
1 <b11>
1 <b111>
1 <x2>777</x2>
2 <x3>888</x3>
</b111>
</b11>
</b1>
</b>
</root>
我的目标是,从当前节点开始依次检索当前节点的逻辑ID号及其所有父节点,祖父节点......等等(根节点除外)。
例如,如果我当前的节点位置是root/a/a1/a11/x2
,那么我想生成类似这样的输出:
输出:2.1.1.1
其中(按顺序,从左到右):
'2' = 'x2' node
'1' = 'a11' node
'1' = 'a1' node
'1' = 'a' node
现在,我所知道的只是通过使用这些XPath获取当前节点ID号并且它只是一级父级:
count(./preceding-sibling::*) + 1
count(../preceding-sibling::*) + 1
但是我仍然无法弄清楚如何得到它的父母身份证号码(如果有的话)。由于XML的节点深度级别不同,并且大部分时间都超过2级深度,因此我也必须考虑这种可能性。
我希望我的问题很明确。
拜托,有人有解决方案吗?如果你能对你的解决方案给出一些解释,那对像我这样的初学者来说非常有用:)
谢谢。
答案 0 :(得分:0)
您可以使用ancestor-or-self
轴枚举节点的所有祖先,如下所示:
<xsl:for-each select="ancestor-or-self::*[position() < last()]">
<xsl:sort select="position()" data-type="number" order="descending"/>
<xsl:value-of select="count(preceding-sibling::*) + 1"/>
<xsl:if test="position() != last()">.</xsl:if>
</xsl:for-each>
对于节点root/a/a1/a11/x2
,这将输出2.1.1.1
。
谓词[position() < last()]
用于排除根元素。 xsl:sort
用于以反向文档顺序处理祖先。