使用标识转换添加 XML 节点,然后在其他模板中输出到 xhtml



我不确定我所要求的是否可行,但我需要首先将两个节点添加到父 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>

相关内容

  • 没有找到相关文章

最新更新