2013-09-23 116 views
0

我以前注意到了这一点,但不记得我是如何得到它的。 EXSLT似乎在节点设置XML字符串时剥离了属性。下面是一个人为的例子(为了简洁起见,我已经将XSLT样式表标签删除了,但EXSLT的公共库正在被加载到名称空间exsl中)。EXSLT节点集剥离属性?

XML

<xml> 
    <node /> 
    <node /> 
    <node /> 
</xml> 

XSLT:

<xsl:template match="/"> 
    <xsl:variable name='nodeset' select='exsl:node-set(xml/node)' /> 
    <xsl:copy-of select='$nodeset' /> 
</xsl:template> 

<xsl:template match='node'><node foo='bar' /></xsl:template> 

结果

<node/><node/><node/> 

Demo Playground(见OUTP ut 来源

回答

1

在输入XML的节点上没有必要使用exsl:node-set。如果在变量中构造结果树片段,然后希望使用XPath来选择结果树片段中的节点,则只需要使用它。

至于样本输入,node元素都没有任何属性。而匹配node的模板从不应用,因为与模板匹配的模板只是创建一个变量,在输入中选择xml/node元素,然后将其副本输出到结果树。

+0

傻我。这是漫长的一天。我明确表示要应用这些模板 - 在我的实际代码中,我这样做了,但在这个演示中,我非常设法避免这个关键线。我想我的大脑在晚上收拾好了。我很清楚节点集的需求情况,这只是我做了一个非常愚蠢的监督。谢谢。 – Utkanos

+0

对于你的示例,你不需要'exsl:node-set',在执行''会正常工作。只要你只想用''复制结果树片段,你也不需要'exsl:node-set'函数。仅需要选择结果树片段中的节点,例如''。 –

+0

再次感谢 - 不知道结果树片段。 – Utkanos

-1

Martin Honnen的回应还有另外一点:EXSLT是一个规范,而不是一个实现。如果有一个错误,它在实施,而不是规范。所以我们需要知道你使用的是什么实现。

但是,您没有提供任何错误的证据。您似乎对于什么exslt:node-set()打算做的事感到困惑。