在我的 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'(,但第二个查询的结果为空。
可能是Xalan的dyn:evaluate实现中的这个错误/限制:
dyn:evaluate 扩展函数是否已知在 Xalan-J 2.7.1 中存在问题?
你为什么要使用Xalan?它已经十年没有升级了。切换到撒克逊语,然后就可以使用 XSLT 3.0xsl:evaluate
,这比dyn:evaluate
全面得多。
尽管如果它是我引用的错误,您可以通过不使用结果树片段来解决它。取代
<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')/*"/>
我想不出您想要复制文档而不是直接使用它的任何可能原因。