在我的XSLT转换中,我使用document()函数加载一个不同的文档。当我使用EXSLT dyn:evaluate()函数动态查询该文档时,它仅适用于没有名称空间的标记。
加载的XML文档如下所示:
<?xml version="1.0"?>
<root xmlns:ctm="http://www.michielmeulendijk.nl/custom">
<nativeNamespace>1</nativeNamespace>
<ctm:externalNamespace>2</ctm:customNamespace1>
</root>
在XSLT转换中,我像这样加载它:
<xsl:variable name="xml-doc">
<xsl:copy-of select="document('complex-sample.xml')/*"/>
</xsl:variable>
然后我用EXSLT扩展查询它:
<xsl:message>
<xsl:value-of select="dyn:evaluate('exsl:node-set($xml-doc)//nativeNamespace')"></xsl:value-of>
</xsl:message>
<xsl:message>
<xsl:value-of select="dyn:evaluate('exsl:node-set($xml-doc)//ctm:externalNamespace')"></xsl:value-of>
</xsl:message>
值得注意的是,第一个查询的结果是正确提供的('1'),但第二个查询的结果是空的。
答案 0 :(得分:-1)
在Xalan的dyn实现中可能存在这个错误/限制:评估:
Is dyn:evaluate extension function known to have issues in Xalan-J 2.7.1?
为什么你还在使用Xalan?它已经升级了十年。切换到Saxon,然后您可以使用XSLT 3.0 xsl:evaluate
,它比dyn:evaluate
更全面。
虽然如果是我引用的bug,你可以通过不使用结果树片段来解决它。取代
<xsl:variable name="xml-doc">
<xsl:copy-of select="document('complex-sample.xml')/*"/>
</xsl:variable>
通过
<xsl:variable name="xml-doc" select="document('complex-sample.xml')/*"/>
我无法想到您希望复制文档而不是直接使用文档的任何可能原因。