2013-10-07 67 views
0

需要您的帮助XPathXSLT从当前节点检索逻辑父节点ID

我是新来的两个人,但现在我必须解决这个听起来像在第一时间简单,但这么多的尝试后,硬的情况下,为我解决:)

我有以下(简化)XML。

首先, “干净” 之一:

<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,然后我想以产生输出similiar这样的:

输出:2.1.1.1

其中(在序列,左到右):

'2' = 'x2' node 
'1' = 'a11' node 
'1' = 'a1' node 
'1' = 'a' node 

现在,我只知道要获得当前节点的ID号,它是一个父级以上只,通过使用这些的XPath :

count(./preceding-sibling::*) + 1 
count(../preceding-sibling::*) + 1 

但我仍然无法弄清楚如何获得它的父母身份证号码的其余(如果有的话)。由于XML的节点深度级别不同,并且大部分时间都超过了2级深度,所以我必须也覆盖这种可能性。

我希望我的问题很清楚。

请问,有人有解决方案吗?对于像我这样的初学者来说,这非常有帮助,如果你可以对你的解决方案给出一些解释:)

谢谢。

回答

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用于以反向文档顺序处理祖先。

+0

谢谢您的回应!现在我要用我的实际数据尝试解决方案。结果我很快就会回来。 –

+0

您的解决方案适用于我。我已经根据我的实际XML数据对其进行了测试,修改代码以进行一些调整以适应我的需要并且工作。非常感谢你。非常感谢。案件关闭。 –