我不确定我所要求的是否可行,但我需要首先将两个节点添加到父 XML 节点中,然后使用不同的模板以 xhtml 输出整个节点。 我不知道如何将转换结果放入第二个模板。 我对 XSL 并不完全陌生,但我对身份转换并不陌生,所以这可能高于我的工资等级。
下面是示例。
我有:
<metadata>
<app><name>a</name></app>
<app><name>b</name></app>
<app><name>c</name></app>
</metadata>
我需要在<metadata>
中再插入 2 个<app>
节点,到目前为止我已经使用了:
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="metadata/app">
<metadata>
<xsl:copy-of select="."/>
<app><name>d</name></app>
<app><name>e</name></app>
<metadata>
</xsl:template>
添加 2 个新的<app>
节点后,我需要使用另一个模板将新转换的<metadata>
输出为 html。 我假设我可以使用:
<xsl:apply-templates select="app"><xsl:sort select="app/name" /></xsl:apply-templates>
我在这里使用模板对节点进行排序,但并不总是确定应用程序/名称节点是否按字母顺序排列。
<xsl:template match="app">
<h1><xsl:value-of select="name"/></h1>
...
</xsl:template>
。但我不知道在哪里或如何使用应用模板将新<metadata>
正确放入最后一个模板中。 提前感谢您的帮助。
编辑所需的最终 html 输出(非常简单):
<h1>a</h1>
<h1>b</h1>
<h1>c</h1>
<h1>d</h1>
<h1>e</h1>
如果要在一个 XSLT 1.0 样式表中执行两个转换步骤,则需要对变量使用 exsl:node-set
或类似步骤,并且可能需要使用模式。
所以定义一个全局变量
<xsl:variable name="result1">
<xsl:apply-templates select="metadata"/>
</xsl:variable>
然后你可以使用
<xsl:template match="/">
<xsl:apply-templates select="exsl:node-set($result1)/app"/>
</xsl:template>
<xsl:template match="app">
<h1><xsl:value-of select="name"/></h1>
...
</xsl:template>
这个简单的示例不需要模式,但只要您想为两个步骤编写相同的匹配模式的模板,就需要使用模式来区分它们。
尝试添加
<xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//
EN" indent="yes"/>
你真的需要在这里进行两次转换吗?在不确切知道您要实现的目标的情况下,作为建议,您可以将app
匹配模板更改为命名模板,并采用默认为name
的参数
<xsl:template match="app" name="outputApp">
<xsl:param name="displayName" select="name" />
<h1><xsl:value-of select="$displayName"/></h1>
...
</xsl:template>
然后,无需创建新的app
元素,只需使用 name 参数的覆盖值调用命名模板,如下所示
<xsl:apply-templates select="app">
<xsl:sort select="app/name" />
</xsl:apply-templates>
<xsl:call-template name="outputApp">
<xsl:with-param name="displayName" select="'d'" />
</xsl:call-template>
<xsl:call-template name="outputApp">
<xsl:with-param name="displayName" select="'e'" />
</xsl:call-template>