从当前节点检索逻辑父节点ID

时间:2013-10-07 20:57:59

标签: xml xslt xpath parent

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级深度,因此我也必须考虑这种可能性。

我希望我的问题很明确。

拜托,有人有解决方案吗?如果你能对你的解决方案给出一些解释,那对像我这样的初学者来说非常有用:)

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用ancestor-or-self轴枚举节点的所有祖先,如下所示:

<xsl:for-each select="ancestor-or-self::*[position() &lt; 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() &lt; last()]用于排除根元素。 xsl:sort用于以反向文档顺序处理祖先。