XPath все потомки, даже если они вложенные - но не потомки родителей - PullRequest
2 голосов
/ 28 апреля 2011

Я пытаюсь написать XPath для работы с некоторыми узлами XML.

Ниже приведен пример моего XML (для имени элемента и иллюстрации вложения).

<Forms> 
<Form> 
 <Control/> 
 <Control>   
    <Control></Control> 
 </Control> 
 <Control>
   <Form><!-- This is the nested one, I don't want the Control children from this-->
    <Control/>
   </Form>
 </Control>
</Form>

Есть ли способ изменить приведенный ниже оператор XPath - включить все элементы управления (даже вложенные внутри друг друга) в «Форму», но не из вложенной формы (см. Форму <2>)? Этот текущий XPath возвращает обратно » Элементы управления ", которые находятся под вложенными узлами" Form ".

string xpath = @"/Forms/Form[@id='" + node.Attributes["id"].Value + "']//Control[@type='GroupItem' or @type='Detail' or @type='GroupHeader']"; 

Я пытаюсь вложить все теги Control и обернуть их тегом «Controls», поэтому я использую этот Xpath в C # для переформатирования - но я не хочу извлекать Control из вложенной формы, Я хочу обернуть их в тег Controls отдельно.

Спасибо за любую помощь!

Ответы [ 3 ]

2 голосов
/ 28 апреля 2011

В XPath 2.0

//Control except //Form//Form//Control

или в XPath 1.0

//Control[not(ancestor::Form/ancestor::Form)]
1 голос
/ 28 апреля 2011

Это будет Control с только одним Form предком:

//Control[count(ancestor::Form)=1]

Редактировать : Лучше

//Control[not(ancestor::Form[2])]
1 голос
/ 28 апреля 2011

Как насчет:

 /Forms/Form[@id='blah']/descendant::Control[blah]

при поиске элемента управления используется ось descendant (по умолчанию child)

Очевидно, заменить blah - они просто для краткости; важная вещь в вышеупомянутом descendant::

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...