Wie bewerbe ich mich Vorlagen für jeden ausgewählten Knoten in einem for-each?
-
06-07-2019 - |
Frage
Ich weiß, dass ich hier etwas fehlt bin. In der XSLT-Transformation unten, wird das tatsächliche Ergebnis das gewünschte Ergebnis nicht überein.
Im Inneren des for-each
, möchte ich die match="track"
Vorlage jedes ausgewählte track
Element anzuwenden. Wenn ich XSLT richtig verstanden habe, mit dem aktuellen Setup nur untergeordnete Knoten jedes ausgewählten track
Element angepasst sind gegen Vorlagen, nicht die track
Elemente selbst.
Wie kann ich die track
Elemente durch die Schablone gehen wie gewünscht? Muß ich meinen gesamten Ansatz zu überdenken?
Hinweis: Die Transformation ausgeführt wird PHP. XML-Deklarationen weggelassen wurden der Kürze halber.
XML-Dokument:
<album>
<title>Grave Dancers Union</title>
<track id="shove">Somebody To Shove</track>
<track id="gold">Black Gold</track>
<track id="train">Runaway Train</track>
<producer>Michael Beinhorn</producer>
</album>
XSL-Stylesheet:
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/album">
<ol>
<xsl:for-each select="track">
<li><xsl:apply-templates/></li>
</xsl:for-each>
</ol>
</xsl:template>
<xsl:template match="track">
<a href="{@id}"><xsl:apply-templates/></a>
</xsl:template>
</xsl:stylesheet>
Ergebnis:
<ol>
<li>Somebody To Shove</li>
<li>Black Gold</li>
<li>Runaway Train</li>
</ol>
Gewünschtes Ergebnis:
<ol>
<li><a href="shove">Somebody To Shove</a></li>
<li><a href="gold">Black Gold</a></li>
<li><a href="train">Runaway Train</a></li>
</ol>
Lösung
Ich würde zustimmen, mit ‚NDIM‘, die Sie wahrscheinlich Ihre XSLT umstrukturieren sollte mit dem xsl zu tun, weg. Foreach-Schleife
Alternativ könnten Sie die xsl ändern: apply-Templates des aktuellen Titels Knoten innerhalb des xsl wählen: for-each
<xsl:for-each select="track">
<li>
<xsl:apply-templates select="." />
</li>
</xsl:for-each>
Halten Sie die xsl:. For-each würde, zumindest, können Sie die Titel in einer anderen Reihenfolge sortieren, falls gewünscht
Andere Tipps
Ich würde restrukturieren es ein wenig (wenn Sie das nicht brauchen Sortierung der for-each
Ansatz ermöglicht):
<xsl:template match="/album">
<ol>
<xsl:apply-templates select="track"/>
</ol>
</xsl:template>
<xsl:template match="track">
<li><a href="{@id}"><xsl:apply-templates/></a></li>
<xsl:template>
Das sieht kürzer und mehr auf den Punkt, IMHO.
Ich denke, Sie
<xsl:for-each select="track">
<li><xsl:apply-templates/></li>
</xsl:for-each>
geht durch alle Gleiselemente mit dem for-each
, und dann gilt die Standardregeln auf seine Nachkommen. So wird der Inhalt des for-each
hat den gleichen Context-Knoten als die match="track"
Vorlage hat und damit die match="track"
Schablone passt nie.
Wenn Sie wirklich die for-each
auf diese Weise verwenden möchten, müssen Sie eine der folgenden zwei Dinge in Ihrem Ansatz ändern:
- Fügen Sie ein
name="track"
Attribut auf diematch="track"
Vorlage, und dann<xsl:call-template/>
verwenden aus demfor-each
(meine Idee, und schlimmer alsTim C
der) - Verwenden Sie
Tim C
Lösung mit<xsl:apply-templates select="."/>
. Dies hat den Vorteil der Namensgebung zu vermeiden und halten die Möglichkeit, die Titel zu sortieren.
Ich denke, mit apply-Templates und Template-Modi ist die sauberere Lösung:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="/">
<body>
<xsl:apply-templates select="album" mode="ol" />
</body>
</xsl:template>
<xsl:template match="album" mode="ol">
<ol>
<xsl:apply-templates select="track" mode="li" />
</ol>
</xsl:template>
<xsl:template match="track" mode="li">
<li>
<xsl:apply-templates select="." />
</li>
</xsl:template>
<xsl:template match="track">
<a href="{@id}">
<xsl:value-of select="." />
</a>
</xsl:template>
</xsl:stylesheet>
Ergebnisse in:
<body>
<ol>
<li>
<a href="shove">Somebody To Shove</a>
</li>
<li>
<a href="gold">Black Gold</a>
</li>
<li>
<a href="train">Runaway Train</a>
</li>
</ol>
</body>
Die for-each Anweisung ändert den Kontextknoten von Album zu verfolgen. Die apply-templates Aufruf standardmäßig gilt Vorlagen auf die untergeordneten Knoten des Kontextknotens, die die untergeordneten Knoten des Spurelement in Ihrem Fall sind. Daher Ihre Vorlage die Streichhölzer ‚Track‘ nie getroffen wird.