如何使用xpath(1.0)迭代/选择成对的元素?

时间:2018-12-23 21:43:31

标签: xml xpath

我有一个带有a和b元素对的xml。并且想遍历它们并做一些工作,但是找不到最简单的方法。我正在使用C#,并希望使用.Net提出建议。我已经尝试过XmlDocument,XPathNavigator和XmlReader,但是卡住了。

我想首先找到“ a”,然后找到“ b”,然后进行处理。然后我想找到下一个“ a”,依此类推。

我想我想要在root之下的级别上使用类似NextSibling之类的东西,但是当我处理a或b以下的元素时,我就迷失了指针/导航器。

<root>
   <a>
        <child 1 />
    </a>
    <b>
         <child 2/>
    </b>
    <a>
        <child 1 />
    </a>
    <b>
        <child 2/>
    </b>
.......
</root>

亲切问候 马丁

3 个答案:

答案 0 :(得分:0)

在处理每个元素a时,您可以测试后面的第一个同级元素是否是元素b。

<xsl:template match="/root/a">
    ...
    <xsl:for-each select="following-sibling::*[1][self::b]">
    ...
    </xsl:for-each>
</xsl:template>

答案 1 :(得分:0)

如果您使用的是最新版本的XPath(3.0或3.1),则可以通过for-each-pair()函数进行此操作:

let $process := function($a, $b) { (: do something :) }
return for-each-pair(//a, //a/following-sibling::*[1][self::b], $process)

答案 2 :(得分:0)

我最终想到了另一种方法,将所有“ b”循环,然后查找最后的“ a”以获取所需的信息

选择所有“ b”

//b

,然后选择当前“ b”之前的最后一个“ a”以获取所需的值。

(preceding-sibling::a)[last()]

感谢所有灵感!