7

私はここで何かが欠けていることを知っています。以下の XSLT 変換では、実際の結果は目的の結果と一致しません。

の中で、選択した各要素にテンプレートをfor-each適用したいと思います。XSLT を正しく理解していれば、現在のセットアップでは、要素自体ではなく、選択された各要素の子ノードのみがテンプレートと照合されます。match="track"tracktracktrack

track要素が必要に応じてテンプレートを通過するようにするにはどうすればよいですか? アプローチ全体を再考する必要がありますか?

注: 変換は PHP を使用して実行されます。簡潔にするために、XML 宣言は省略されています。

XML ドキュメント:

<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 スタイルシート:

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

結果:

<ol>
    <li>Somebody To Shove</li>
    <li>Black Gold</li>
    <li>Runaway Train</li>
</ol>

望ましい結果:

<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>
4

4 に答える 4

14

xsl:for-eachループを廃止するためにXSLTを再構築する必要があるという'ndim'に同意します。

または、xsl:apply-templatesを修正して、xsl:for-each内の現在のトラックノードを選択することもできます。

<xsl:for-each select="track">
   <li>
      <xsl:apply-templates select="." />
   </li>
</xsl:for-each>

xsl:for-eachを保持すると、少なくとも、必要に応じてトラックを別の順序で並べ替えることができます。

于 2009-10-25T10:43:00.230 に答える
0

for-eachステートメントは、コンテキストノードをアルバムからトラックに変更します。apply-templates呼び出しは、デフォルトで、コンテキストノードの子ノード(この場合はtrack要素の子ノード)にテンプレートを適用します。したがって、「track」に一致するテンプレートがヒットすることはありません。

于 2009-10-29T17:44:57.527 に答える
0

apply-template と template モードを使用するのがよりクリーンなソリューションだと思います。

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

結果:

<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>
于 2009-10-26T12:15:32.347 に答える