Разрабатываемое мной приложение получает структуру 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 является n потомком поколения Действительный предок.
- Child может быть m потомком поколения Контейнер предок, который является o потомком поколения Действительный предок.
- Допустимые предки для Дочерний элемент являются Контейнер элементов в качестве m предков поколения и Действительный элемент в качестве предка первого поколения.
где m, n, o - натуральные числа.
Мне нужно записать следующие выражения XPath
Valid/Child
Valid/Container/Child
Valid/Container/Container/Child
Valid/Container/Container/Container/Child
...
как одиночное выражение XPath.
Для предоставленного примера выражение XPath вернет только Child элементы, имеющие name атрибут, равный Child1 , Child2 , Child3 и Child4 .
Самое близкое решение, которое я нашел, - следующее выражение.
Valid/Child | Valid//*[self::Container]/Child
Однако этовыбрал бы Child элемент с атрибутом name , равным Child19 и Child20 .
Поддерживает ли синтаксис XPath любое дополнительное вхождениеэлемента или установочного условия, аналогичного self в предыдущем примере для всех предков между Child и Valid elements?