我需要了解如何创建一个XPath,只返回root_level元素的id值,其值为2,紧跟在root_level 1值之后。我花了几个小时在网站上查看之前对类似帖子的回复,但他们没有遇到我遇到的相同类型的限制。
以下是一个示例XML代码段。它们可以多更长:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<item>
<id>659478</id>
<name>Company A</name>
<root_level>1</root_level>
</item>
<item>
<id>692557</id>
<root_level>2</root_level>
</item>
<item>
<id>659482</id>
<root_level>2</root_level>
</item>
<item>
<id>666534</id>
<root_level>3</root_level>
</item>
<item>
<id>665260</id>
<root_level>3</root_level>
</item>
<item>
<id>665773</id>
<root_level>3</root_level>
</item>
<item>
<id>635003</id>
<name>Company B</name>
<root_level>1</root_level>
</item>
<item>
<id>635005</id>
<root_level>2</root_level>
</item>
<item>
<id>635015</id>
<root_level>2</root_level>
</item>
<item>
<id>671626</id>
<root_level>2</root_level>
</item>
<item>
<id>584793</id>
<name>Company C</name>
<root_level>1</root_level>
</item>
<item>
<id>623716</id>
<root_level>2</root_level>
</item>
<item>
<id>698585</id>
<root_level>3</root_level>
</item>
</result>
我尝试了以下XPath的变体,但这需要始终知道下一个root_level 1名称。请注意,也可能没有以下root_level 3值。唯一的常量是root_level 1始终存在。
//item[root_level=2][preceding-sibling::item[name='Company A'] and following-sibling::item[name='Company B']]/id
此外,我被迫在我的解决方案中使用XPath 1.0。
如果有人可以指出我正确的方向来约束root_level 2返回的结果只匹配那些基于下降顺序的特定root_level 1名称的结果,我将非常感激。感谢。
答案 0 :(得分:1)
您可以尝试这种方式返回与某些公司对应的所有 root-level-2 id 元素,即'Company A'
:
//item[root_level=2][preceding-sibling::item[root_level=1][1][name='Company A']]/id
//item[root_level=2]
:找到所有root-level-2 <item>
... [preceding-sibling::item[name][1][name='Company A']]
:...拥有最近的兄弟根级别1 <name>
等于"Company A"
/id
:然后返回<id>
子元素