Немного туманно относительно «следующей» оси xpath (как в xslt) - PullRequest
2 голосов
/ 17 марта 2011
 <a>
   <x/>
   <m/>
   <y/>
   <m/>
 </a>

Внутри шаблона, который соответствует «а», я хочу сопоставить (сначала) любые «м» перед «у», а затем отдельно любые «м» после «у».

<xsl:apply-templates select="./m[following::y]"/>

это то, о чем я думал, но я не могу заставить его работать, и, кроме того, я не вижу, как предотвратить применение шаблона, который соответствует 'm', в обычном потоке, а также в конкретном местеЯ хочу вставить контент, связанный с m.

1 Ответ

3 голосов
/ 17 марта 2011

Ваш шаблон выглядит нормально, но вы уверены, что хотите использовать following?Например, этот шаблон:

<xsl:template match="a">
    <a><xsl:apply-templates select="m[following::y]"/></a>
    <b><xsl:apply-templates select="m[following-sibling::y]"/></b>  
</xsl:template>

... применяется к следующему XML:

<a>
   <x/>
   <m>match</m>
   <y/>
   <m>no match</m>
   <nested>
       <m>match 2</m>
       <y/>
   </nested>
</a>

... выводит следующий результат:

<a>matchno match</a>
<b>match</b>

Первый apply-templates соответствует <m>no match</m>, поскольку following включает в себя все узлы, следующие за контекстным узлом в порядке документа, который включает в себя вложенный <y/>.

Второй шаблон соответствует только родным элементам.

Для полноты я добавлю следующий шаблон, который соответствует только тем <m> узлам, чей немедленный следующий брат или сестра <y>:

<xsl:template match="a">
   <a><xsl:apply-templates select="m[following-sibling::*[1][self::y]]"/></a>
</xsl:template>

Этот шаблон выводитс учетом приведенного выше XML:

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