XPath исключает узел и его потомков - PullRequest
0 голосов
/ 10 марта 2012

У меня есть такой XML-код:

<Root xmlns:test1="http://www.test1.com" xmlns:test2="http://www.test2.com" Attr="root">
  <test1:Child1 Attribute1="c1" Bttribute="c2" Cttribute="c3">
    <child11 Attribute11="c11">Element11</child11>
  </test1:Child1>
  <test2:Child2 Attribute2="c2">
    <child21 Attribute21="c21">
        <child211 />
        <child212 />
        <child213 />
    </child21>
    <child22 Attribute22="c22">Element22</child22>
  </test2:Child2>
  <test2:Child3 Attribute3="c3">
    <child31>Element31</child31>
  </test2:Child3>
</Root>

Я хотел бы написать XPath, чтобы я мог выбрать все, кроме элемента child21 и его потомков. Чтобы вывод выглядел следующим образом:

<Root xmlns:test1="http://www.test1.com" xmlns:test2="http://www.test2.com" Attr="root">
  <test1:Child1 Attribute1="c1" Bttribute="c2" Cttribute="c3">
    <child11 Attribute11="c11">Element11</child11>
  </test1:Child1>
  <test2:Child2 Attribute2="c2">
    <child22 Attribute22="c22">Element22</child22>
  </test2:Child2>
  <test2:Child3 Attribute3="c3">
    <child31>Element31</child31>
  </test2:Child3>
</Root>

что за код xpath для этого?

Большое спасибо

Ответы [ 3 ]

1 голос
/ 10 марта 2012

XPath никогда не изменяет узлы, которые он выбирает, он просто выбирает их.Если ваш выбор включает, скажем, элемент Root, то при сериализации он будет включать все элементы входного документа, даже если вы выберете только этот единственный элемент.

Вы можете перебирать все элементы, у которых нет child21 вих ось предка или самого себя:

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

Но это не очень полезно, если вы хотите сгенерировать показанный результат.

Тривиально отфильтровать этот элемент и его потомков с помощью xslt, просто иметь шаблон идентификации и добавить один шаблон

<xsl:template match="child21"/>

, который отбрасывает эту ветвь ввода, но вы можете 'сделать это только с XPath.

0 голосов
/ 10 марта 2012

XPath выберет узлы, но если вы действительно хотите скопировать XML, пропуская определенные элементы, то вам нужен XSLT - это даст желаемый вывод:

0 голосов
/ 10 марта 2012

XPath для исключения child21

/Root/*/*[not(local-name()='child21')]

Это дает результат как

child11
child22
child31

Измените это согласно вашему требованию.

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