如何使用等于当前所选节点的属性值的属性在主文档中定位节点

时间:2014-01-26 14:00:01

标签: xml xpath

我正在处理文档中的节点列表,一次一个节点。

在处理过程中,我需要使用我正在处理的节点的本地属性的值从更宽的文档中选择节点。

我希望在单个XPath中表达这一点。

如果我第一次获取本地属性值,我可以将其插入xpath,但我不希望这样做,因为我希望Xpath是自包含的。

以下文档是结构类型的示例,但仅用于说明。

<root>
    <pageGenre>
      <page ref="attvalue1"/>
      <genre>horror</genre>
    </pageGenre>
    <pageGenre>
      <page ref="attvalue1"/>
      <genre>thriller</genre>
    </pageGenre>
    <pageGenre>
      <page ref="attvalue2"/>
      <genre>cooking</genre>
    </pageGenre>
    <book att="attvalue1">
      <author>Lovecraft</author>
    </book>
    <book att="attvalue2">
      <author>E.E. Smith</author>
    </book>
</root>

我首先从文档中找到我的节点列表:

.//书

然后,对于每个书籍节点,我使用该节点然后获取att

的值

./@ ATT

每次都有效。

我希望能够做的是通过一个Xpath获取该书的所有页面类型。

我试过了:

// pageGenre / page [@ref = ./@ att] /../ genre

这不起作用,空白。

如果我使用

[@ ref = // @ att]

我只是获得了文档中所有书籍att的所有类型。

如果我首先解析./@att值然后编写我的Xpath,它工作正常,但我不想“知道”这需要完成,因为我想要一个XPath列表来操作没有使用通用调度程序的任何特殊情况。

我也尝试了self::/@att,但这和./@att一样,正如人们所期望的那样。

任何想法都非常感激。

1 个答案:

答案 0 :(得分:0)

您希望从单个节点启动XPath查询并对其进行反向引用(以获取att的值),功能中没有任何功能可以执行此操作。以下问题有点确认。

  

“我可以看到在评论中完成您在下面描述的内容的唯一方法是使用LINQ to XML,XPath变量或定义您自己的current()函数”。 [.NET XPath starting from a specific element and backreferencing to it]

我们在这里尝试:

//pageGenre/page[@ref = ./@att]/../genre

无效,因为./@att正在选择相对于当前节点的att属性,即<page>而不是<book>。要引用该部分中的<book>节点,您需要使用current()函数。

所以最后,解决方案是实现上面链接中提供的3种方式中的一种,或者如果它们都变得过于复杂/过度,那么只需坚持att的存储值即可。每次迭代的开始。