EXSLT dyn:使用命名空间进行评估

时间:2017-07-22 20:05:32

标签: xml xslt xalan exslt

在我的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'),但第二个查询的结果是空的。

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

我无法想到您希望复制文档而不是直接使用文档的任何可能原因。