EXSLT dyn:evaluate with namespace



在我的 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')/*"/>

我想不出您想要复制文档而不是直接使用它的任何可能原因。

最新更新