XML и XPath выражение - PullRequest
       1

XML и XPath выражение

1 голос
/ 19 ноября 2010

Скажите, у меня есть этот XML:

<root>
    <A></A>
    <B></B>
    <C>one</C>
    <C>two</C>
    <C>three</C>
    <D></D>
</root>

Теперь я хочу получить все узлы, кроме узлов C «два» и «три». Теперь я хочу выбрать, какой узел C может оставаться по индексу.

Итак, это xpath, который у меня уже есть:

 //*[not(ancestor-or-self::C)]

Но это удаляет все узлы C, поэтому теперь мне нужно добавить индекс, к которому я хочу остаться.

//*[not(ancestor-or-self::C)] exept for C[1]

Как я могу выполнить это, чтобы мой вывод был, если я выберу индекс 1:

<root>
   <A></A>
   <B></B>
   <C>one</C>
   <D></D>
</root>

Или, если я выберу индекс 2:

<root>
   <A></A>
   <B></B>
   <C>two</C>
   <D></D>
</root>

Надеюсь, я достаточно ясно дал понять: p ТНХ

Ответы [ 3 ]

1 голос
/ 19 ноября 2010

Почему кроме? У вас есть любой элемент, кроме этих , тогда вы добавляете некоторые из них:

//*[not(ancestor-or-self::C)]|//C[1]/descendant-or-self::*
1 голос
/ 19 ноября 2010

Я думаю, это зависит от того, что вы определяете как «индекс».Если вы определите «index» как C, у которого есть n-1 C-братьев и сестер, то вы можете просто сделать:

, чтобы отобразить первый (избавиться от всех впоследствиитолько второй

/root/*[not(name() = 'C' and (count(preceding::C) < 1 or count(preceding::C) > 1))]

(я проверял это с: http://www.xmlme.com/XpathTool.aspx просто к сведению)

0 голосов
/ 19 ноября 2010

Используйте

//*[not(self::c and not(count(preceding-sibling::c) = $ind - 1))]

где $ ind - это требуемая позиция (на основе 1) элемента c, который вы хотите выбрать.

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