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

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

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>

最佳答案

我同意 '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>

如果需要,保留 xsl:for-each 至少可以让您以其他顺序对轨道进行排序。

关于xslt - 如何将模板应用于 for-each 中的每个选定节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1620527/

相关文章:

r - 错误: object '.doSnowGlobals' not found?

java - 有没有办法缩短java中的for-each循环?

javascript - addEventListener 的回调函数的参数如何添加 forEach 索引?

xslt - XSL中的 'call-template'和 'apply-templates'有什么区别?

xslt - 对文本节点应用一系列函数

xml - 如何在我的转换输出中打印 '&#32' 的文字字符串

xslt - 来自其他语言的 XSLT 的两个概念 : apply-templates and xpath

xslt - 为孙子中的每个标记复制 node() 并用 XSLT 1.0 中的标记替换孙子的元素文本?

c++ - Xerces/Xalan : UNC path as argument for document function?

java - 如何使用递增计数器在 XSLT 中提供唯一 ID?