XSLT执行身份转换并使用转换后的数据

时间:2013-04-18 12:09:57

标签: xml xslt

依旧使用XSLT。通过使用id-transformation改变了我对解决方案的方法,但是无法解决,如何直接使用转换后的项目(如果可能的话)

来源是两个列表,它们将由id转换组合在一起。映射列表转换后的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节点,从第二个列表添加信息并添加所需的属性。

<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节点做任何事情。使用模板,按类型选择,没有任何作用,是否真的只能生成输出,而不是进一步处理?

2 个答案:

答案 0 :(得分:1)

使用xslt version = 1.0,您可以使用扩展名“not-set”。 将新生成的内容放在变量中并使用此

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

答案 1 :(得分:1)

使用XSLT 1.0,如果您创建一个包含节点的变量,那么它就是一个结果树片段,您可以做的只是xsl: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处理器的文档是否支持EXSLT命名空间中的node-set函数或其他函数(如MSXML),在这种情况下,您需要检查function-available支持哪个函数并编写xsl:choose检查以确保在apply-templates中使用支持的函数。

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