<a>
<x/>
<m/>
<y/>
<m/>
</a>
W szablonie, który pasuje do „a”, chcę dopasować (najpierw) dowolne „m” przed „y”, a następnie oddzielnie dowolne „m” po „y”.
<xsl:apply-templates select="./m[following::y]"/>
właśnie o tym myślałem, ale nie mogę go uruchomić,a ponadto nie mogę zobaczyć, jak uniemożliwić stosowanie szablonu pasującego do „m” w normalnym przepływie, a także w konkretnym miejscu, w którym chcę wstawić treść związaną z m.
Odpowiedzi:
3 dla odpowiedzi № 1Twój szablon wygląda OK, ale czy na pewno chcesz użyć following
? Na przykład ten szablon:
<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>
... zastosowane do następującego pliku XML:
<a>
<x/>
<m>match</m>
<y/>
<m>no match</m>
<nested>
<m>match 2</m>
<y/>
</nested>
</a>
... wyświetla następujący wynik:
<a>matchno match</a>
<b>match</b>
Pierwszy apply-templates
mecze <m>no match</m>
bo following
obejmuje wszystkie węzły znajdujące się za węzłem kontekstowym w kolejności dokumentów, w tym także zagnieżdżone <y/>
.
Drugi szablon pasuje tylko do rodzeństwa.
Dla kompletności dodam następujący szablon, który pasuje tylko do tych <m>
węzły, których natychmiastowy następujące rodzeństwo to <y>
:
<xsl:template match="a">
<a><xsl:apply-templates select="m[following-sibling::*[1][self::y]]"/></a>
</xsl:template>
Ten szablon generuje następujące dane, biorąc pod uwagę powyższy kod XML:
<a>match</a>