как для каждого родительского узла выбрать каждый не первый дочерний узел в дереве с несколькими родительскими узлами - PullRequest
2 голосов
/ 23 июля 2010

Его,

Я думаю, у меня есть каверзные вопросы для экспертов XPath.Существует такая структура узлов:

A(1)-|
     |-B(1)
     |-B(2)
     |-B(3)
A(2)-|
     |-B(2.1)
     |-B(2.2)
     |-B(2.3)
...

Как с помощью одного выражения XPath извлечь только следующие узлы

A(1)-|
     |-B(2)
     |-B(3)
A(2)-|
     |-B(2.2)
     |-B(2.3)
...

То есть для каждого родительского узла его первый дочерний узелэлемент должен быть исключен.

Я пробовал A / B [position ()! = 1], но это отфильтровывает только B (1.1) и выбирает B (2.1).

Спасибо

Ответы [ 2 ]

3 голосов
/ 23 июля 2010

Это выражение XPath (без оси preceding-sibling:: используется):

/*/a/*[not(position()=1)]

при применении к этому документу XML :

<t>
 <a>
   <b11/>
   <b12/>
   <b13/>
 </a>
 <a>
   <b21/>
   <b22/>
   <b23/>
 </a>
</t>

выбирает нужные узлы :

<b12 />
<b13 />
<b22 />
<b23 />

Это можно проверить с помощью этого XSLT-преобразования, дающего приведенный выше результат :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select="/*/a/*[not(position()=1)]"/>
 </xsl:template>
</xsl:stylesheet>
2 голосов
/ 23 июля 2010

Tricky. Вы можете выбрать узлы, которые имеют предшествующих братьев и сестер:

A/B[preceding-sibling::*]

Это не удастся для первого элемента и удастся для остальных.

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