依旧使用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节点做任何事情。使用模板,按类型选择,没有任何作用,是否真的只能生成输出,而不是进一步处理?
答案 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-of
或xsl: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中的任何临时树,如主输入树,而无需使用扩展功能。