0

仍在摆弄 XSLT。通过使用 id-transformation 更改了我的解决方案方法,但无法退出,如何直接使用转换后的项目(如果可能)

源是两个列表,它们将通过 id-transformation 组合在一起。映射列表转换后的 xml,项目被导入到 $items 变量中。

<mapping>
    <sub id="1" item="a" group="a">
    <sub id="2" item="b" group="a">
    <sub id="3" item="d" group="b">
    <sub id="4" item="e" group="b">
    <sub id="5" item="f" group="c">
</mapping>

<items>
    <item id="a" val="OK"/> 
    <item id="b" val="ERROR"/>
    <item id="c" val="OK"/>
    <item id="d" val="OK"/>
    <item id="e" val="OK"/>
    <item id="f" val="OK"/>
</items>

使用 id-transformation,我将子节点更改为 NewItem-nodes,从第二个列表中添加信息并添加所需的属性。

<xsl:template match="node() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="sub">
    <xsl:element name="NewItem">
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates select="$items/item[@id = ./@item]/@group"/>
    </xsl:element>
</xsl:template>

但在那之后,我似乎无法对生成的 NewItem 节点做任何事情。使用模板,按类型选择它们,没有任何效果,真的只能生成输出,而不是进一步处理吗?

4

2 回答 2

1

在 XSLT 1.0 中,如果您创建一个包含节点的变量,它就是一个结果树片段,您所能做的就是 doxsl:copy-ofxsl:value-of. 如果您想进一步处理或选择结果树片段中的节点,那么您需要使用扩展功能,exsl:node-set例如,如果您有<xsl:variable name="items"><NewItems><xsl:apply-templates/></NewItems></xsl:variable>并且想要将模板应用于您需要的结果树片段中的节点

<xsl:apply-templates select="exsl:node-set($items)/NewItems/NewItem"/>

您在样式表中绑定的位置xmlns:exsl="http://exslt.org/common"。但是请注意,对于可移植样式表,您可能需要检查 XSLT 处理器的文档,它是否支持node-setEXSLT 命名空间中的函数或不同的函数(如 MSXML),在这种情况下,您需要检查function-available支持哪个函数并且编写xsl:choose检查以确保在apply-templates.

如果您可以迁移到 XSLT 2.0 处理器,您会发现限制已经消失,您可以像使用主输入树一样使用 XSLT 2.0 中的任何临时树,而无需使用任何扩展函数。

于 2013-04-18T12:56:37.413 回答
1

使用 xslt version=1.0,您可以使用扩展名“未设置”。将新生成的内容放入变量中并使用它

 <xsl:apply-templates select="exsl:node-set($NewItem_var) />

要让它醒来,您必须添加以下行。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl"
    version="1.0">
于 2013-04-18T12:50:53.897 回答