Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT执行标识转换并使用转换后的数据_Xml_Xslt - Fatal编程技术网

Xml XSLT执行标识转换并使用转换后的数据

Xml XSLT执行标识转换并使用转换后的数据,xml,xslt,Xml,Xslt,仍然在摆弄XSLT。通过使用id转换改变了我的解决方案,但无法退出,如何直接使用转换的项(如果可能) 源是两个列表,将通过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"> <

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

源是两个列表,将通过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转换,我将子节点更改为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节点执行任何操作。使用模板,按类型选择它们,没有任何效果,是否真的只能为输出而不是为进一步处理而生成?

如果xslt版本=1.0,则可以使用扩展名“not set”。 将新生成的内容放入变量中并使用

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

使用XSLT1.0,如果创建一个包含节点的变量,它将是一个结果树片段,您所能做的就是执行
xsl:copy of
xsl:value of
。如果要进一步处理或选择结果树片段中的节点,则需要首先使用扩展函数,如
exsl:node set
,例如,如果您有
,并且希望将模板应用于所需结果树片段中的节点

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

在样式表中绑定
xmlns:exsl=”的位置http://exslt.org/common“
。但是请注意,对于可移植样式表,您可能需要检查XSLT处理器的文档,看看它是否支持EXSLT命名空间中的
节点集
函数,还是其他函数(如MSXML),在这种情况下,您需要检查可用的
函数
支持哪个函数,并写入
xsl:choose
检查以确保在
应用模板
中使用受支持的函数


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

似乎您没有从几乎相同问题的答案中学到任何东西——我懒得在这里复制相同的答案——也懒得复制相同的注释,解释其细节。人们可以通过阅读一本好的XSLT书籍来更好地了解该语言的基础知识。
<xsl:apply-templates select="exsl:node-set($items)/NewItems/NewItem"/>