我正在开发的应用程序接收类似以下 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>
我需要根据以下条件获取Child元素列表:
- Child是Valid祖先的n代后代。
- Child可以是Container祖先的m代后代,而该Container祖先是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 表达式将仅返回具有名称属性等于 Child1、Child2、Child3 和 Child4 的子元素。
我找到的最接近解决方案的表达式如下。
Valid/Child | Valid//*[self::Container]/Child
然而,这会选择名称属性为Child19和Child20的Child元素。XPath语法是否支持元素的可选出现或在前面的示例中设置类似于所有祖先之间的条件,其位于Child和Valid元素之间?
Valid/Child | Valid/Container/Child | Valid/Container/Container/Child
。也许@Alejandro或@Dimite会提供一种跳过Container
步骤的简便方法。 - FlackValid//Child[not(ancestor::Wrapper)]
- Flack