如何将模板应用于for-each中的每个选定节点?

Jak*_*kob 7 xslt foreach apply-templates

我知道我在这里遗漏了一些东西.在下面的XSLT转换中,实际结果与期望的结果不匹配.

在里面for-each,我想将match="track"模板应用于每个选定的track元素.如果我已正确理解XSLT,那么在当前设置中,每个所选track元素的子节点只与模板匹配,而不是track元素本身.

如何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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

结果:

<ol>
    <li>Somebody To Shove</li>
    <li>Black Gold</li>
    <li>Runaway Train</li>
</ol>
Run Code Online (Sandbox Code Playgroud)

期望的结果:

<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>
Run Code Online (Sandbox Code Playgroud)

Tim*_*m C 14

我同意'ndim'你应该重构你的XSLT以取消xsl:for-each循环.

或者,您可以修改xsl:apply-templates以选择xsl:for-each中的当前轨道节点

<xsl:for-each select="track">
   <li>
      <xsl:apply-templates select="." />
   </li>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

保持xsl:for-each至少可以让你按照其他顺序对曲目进行排序,如果需要的话.