Xml XSLT执行标识转换并使用转换后的数据
仍然在摆弄XSLT。通过使用id转换改变了我的解决方案,但无法退出,如何直接使用转换的项(如果可能) 源是两个列表,将通过id转换进行组合。映射列表显示转换后的xml,这些项被导入到$items变量中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"> <
<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"/>