【发布时间】:2011-02-12 22:07:03
【问题描述】:
我正在开发的应用程序接收到类似于以下的 XML 结构:
<Root>
<Valid>
<Child name="Child1" />
<Container>
<Child name="Child2" />
</Container>
<Container>
<Container>
<Child name="Child3"/>
<Child name="Child4"/>
</Container>
</Container>
<Wrapper>
<Child name="Child5" />
</Wrapper>
<Wrapper>
<Container>
<Child name="Child19" />
</Container>
</Wrapper>
<Container>
<Wrapper>
<Child name="Child6" />
</Wrapper>
</Container>
<Container>
<Wrapper>
<Container>
<Child name="Child20" />
</Container>
</Wrapper>
</Container>
</Valid>
<Invalid>
<Child name="Child7" />
<Container>
<Child name="Child8" />
</Container>
<Container>
<Container>
<Child name="Child9"/>
<Child name="Child10"/>
</Container>
</Container>
<Wrapper>
<Child name="Child11" />
</Wrapper>
<Container>
<Wrapper>
<Child name="Child12" />
</Wrapper>
</Container>
</Invalid>
</Root>
我需要在以下条件下获取子元素的列表:
- 孩子是有效祖先的n代后代。
- Child 可能是 Container 祖先的 m 代后代,它是 Valid 的 o 代后代> 祖先。
- Child 元素的有效祖先是作为 m 代祖先的 Container 元素和作为第一代祖先的 Valid 元素.
其中 m、n、o 是自然数。
我需要编写以下 XPath 表达式
Valid/Child
Valid/Container/Child
Valid/Container/Container/Child
Valid/Container/Container/Container/Child
...
作为单个 XPath 表达式。
例如,XPath 表达式将只返回 name 属性等于 Child1、Child2 的 Child 元素>、Child3 和 Child4。
我最接近解决方案的是以下表达式。
Valid/Child | Valid//*[self::Container]/Child
但是,这会选择 name 属性等于 Child19 和 Child20 的 Child 元素。
XPath 语法是否支持在 Child 和 Valid 元素之间的所有祖先元素的可选出现或设置类似于前面示例中的 self 的条件?
【问题讨论】:
-
有趣的一个。 +1。我只记得像
Valid/Child | Valid/Container/Child | Valid/Container/Container/Child这样的简单联合。可能是@Alejandro 或@Dimite 将提供一种仅跳过Container步骤的简单方法。 -
@Flack +1。这确实涵盖了提供的示例。但是,Valid 和 Child 元素之间的 Container 元素的数量是任意的(0,1,2,3,...)跨度>
-
我希望@Dimitre 有解决方案。
-
@Rest Wing,这也足以作为您的示例:
Valid//Child[not(ancestor::Wrapper)] -
@Flack:+1。是的,这个例子就足够了。但是,可能存在任意数量的此类“无效”祖先。因此,我需要一个更通用的表达式,比如
Valid//Child[each ancestor after Valid::Container)]