<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 № 1Seu 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>