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>
War es hilfreich?

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:

  1. Fügen Sie ein name="track" Attribut auf die match="track" Vorlage, und dann <xsl:call-template/> verwenden aus dem for-each (meine Idee, und schlimmer als Tim C der)
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top