Применить шаблон к предшествующему брату следующего брата текущего узла - PullRequest
2 голосов
/ 01 июня 2011

Привет, у меня есть следующие Ввод

<Root>
    <A rename="yes"/>
    <B rename="no"/>
    <C rename="no"/>
    <D rename="yes"/>
    <E rename="no"/>
    <F all="yes"/>
</Root>

В настоящее время я нахожусь на <A>, и я хочу применить шаблон для элемента, чей @rename="yes", который предшествует элементу <F>.

Я пытаюсь сделать что-то вроде:

<xsl:apply-templates select=
 "following-sibling::*[@all='yes']/preceding-sibling::node()[@rename='yes'" />

Но я не получаю ожидаемый результат.Пожалуйста, предложите.

1 Ответ

4 голосов
/ 01 июня 2011

В настоящее время я нахожусь на <A> и хочу применить шаблон к элементу, чей @rename="yes" предшествует элементу <F>

Вы хотите этот XPathВыражение (при условии, что A имеет только одного следующего родного брата с именем F):

following-sibling::F/preceding-sibling::*[@rename='yes'][1]

Выбирает любой элемент, атрибут rename которого имеет значение "yes", и это первый такойпредшествующий элемент любого следующего элемента (текущего узла) с именем F.

Вот полное преобразование XSLT :

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

 <xsl:template match="A">
     <xsl:apply-templates mode="found" select=
     "following-sibling::F/preceding-sibling::*[@rename='yes'][1]"/>
 </xsl:template>

 <xsl:template match="*" mode="found">
  <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

, когдаприменяется к предоставленному документу XML :

<Root>
    <A rename="yes"/>
    <B rename="no"/>
    <C rename="no"/>
    <D rename="yes"/>
    <E rename="no"/>
    <F all="yes"/>
</Root>

желаемый, правильный результат получается :

<D rename="yes"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...