/ / nieco mgliste na temat osi „podążającej” xpath (jak w xslt) - xslt

trochę mglista o osi „podążającej” xpath (jak w xslt) - xslt

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

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