添加带有标识转换的XML节点,然后以不同的模板输出到xhtml

添加带有标识转换的XML节点,然后以不同的模板输出到xhtml,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我不确定我所要求的是否可行,但我需要首先将两个节点添加到父XML节点中,然后使用不同的模板在xhtml中输出全部内容。我不知道如何将转换结果放入第二个模板。我对XSL并不完全陌生,但我对身份转换还不熟悉,所以这可能高于我的工资等级 下面是一个例子 我有: <metadata> <app><name>a</name></app> <app><name>b</name></app&g

我不确定我所要求的是否可行,但我需要首先将两个节点添加到父XML节点中,然后使用不同的模板在xhtml中输出全部内容。我不知道如何将转换结果放入第二个模板。我对XSL并不完全陌生,但我对身份转换还不熟悉,所以这可能高于我的工资等级

下面是一个例子

我有:

<metadata>
    <app><name>a</name></app>
    <app><name>b</name></app>
    <app><name>c</name></app>
</metadata>

A.
B
C
我需要在
中再插入两个
节点,到目前为止我已经使用了:

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

D
E
添加两个新的
节点后,我需要使用另一个模板将新转换的
输出为html。我想我可以使用:

<xsl:apply-templates select="app"><xsl:sort select="app/name" /></xsl:apply-templates>

我在这里使用了一个模板来对节点进行排序,但因为并不总是确定app/name节点是否按字母顺序排列

<xsl:template match="app">
    <h1><xsl:value-of select="name"/></h1>
    ...
</xsl:template>

...
…但我不知道在哪里或如何使用应用模板将新的
正确地放入上一个模板中。提前感谢你的帮助

编辑所需的最终html输出(非常简单):

a
B
C
D
E

如果希望在一个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"/>

您真的需要在这里进行两次转换吗?建议您在不确切了解您想要实现的目标的情况下,可以将
应用程序
匹配模板更改为命名模板,并使用默认为
名称
的参数

<xsl:template match="app" name="outputApp">
    <xsl:param name="displayName" select="name" />
    <h1><xsl:value-of select="$displayName"/></h1>
    ...
</xsl:template>

看到您期望从转换中获得的最终输出会很有帮助,IMHO。好主意。作为澄清,我并不总是知道d和e的名称与其他应用程序节点的名称按正确的字母顺序排列。这就是为什么我试图添加节点,然后在作为html输出之前对其进行排序。这似乎是一种方法,但由于某些原因,
没有进入应用程序模板。如果我只是输出变量,它似乎有正确的结构。我可能需要检查模式,但感谢您让我走上正轨。如果XPath表达式没有选择任何内容,那么通常名称空间就是原因。您的样式表在树的哪个位置?在这种情况下,将
xmlns=“”
放在
xsl:variable
上,您需要
xmlns=“”
放在
xsl:template match=“metadata”
上,因为新的
节点没有添加到元数据中,所以刚刚编辑了原始问题中的标识转换。因此,有了这一变化,我认为问题可能来自于同时拥有
。是这样吗?我感谢你的帮助。
<xsl:template match="app" name="outputApp">
    <xsl:param name="displayName" select="name" />
    <h1><xsl:value-of select="$displayName"/></h1>
    ...
</xsl:template>
    <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>