/ / um pouco nebuloso sobre o eixo xpath 'following' (como usado no xslt) - xslt

um pouco nebuloso sobre o eixo xpath 'following' (usado em xslt) - xslt

 <a>
<x/>
<m/>
<y/>
<m/>
</a>

Dentro de um modelo que corresponde a "a", desejo corresponder (primeiro) qualquer "m" s antes de "y" e depois separadamente quaisquer "m" s após "y".

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

foi o que pensei, mas não consigo fazer funcionar,e, além disso, não consigo ver como impedir que o modelo correspondente a "m" seja aplicado no fluxo normal, bem como no local específico em que desejo inserir o conteúdo relacionado a m.

Respostas:

3 para resposta № 1

Seu modelo parece bem, mas você tem certeza de que deseja usar following? Por exemplo, este modelo:

<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>

... aplicado ao seguinte XML:

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

... gera o seguinte resultado:

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

O primeiro apply-templates fósforos <m>no match</m> Porque following inclui todos os nós que estão após o nó de contexto na ordem do documento, que inclui o nó aninhado <y/>.

O segundo modelo corresponde apenas a irmãos.

Para completar, adicionarei o seguinte modelo, que corresponde apenas aos <m> nós cujos imediato seguinte irmão é um <y>:

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

Este modelo gera o seguinte, considerando o XML acima:

<a>match</a>