Xml EXSLT dyn:使用命名空间进行计算
在XSLT转换中,我使用document函数加载不同的文档。当我使用EXSLT dyn:evaluate函数动态查询该文档时,它只对没有名称空间的标记有效 加载的XML文档如下所示:Xml EXSLT dyn:使用命名空间进行计算,xml,xslt,xalan,exslt,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:exter
<?xml version="1.0"?>
<root xmlns:ctm="http://www.michielmeulendijk.nl/custom">
<nativeNamespace>1</nativeNamespace>
<ctm:externalNamespace>2</ctm:customNamespace1>
</root>
<xsl:variable name="xml-doc">
<xsl:copy-of select="document('complex-sample.xml')/*"/>
</xsl:variable>
在XSLT转换中,我按如下方式加载它:
<?xml version="1.0"?>
<root xmlns:ctm="http://www.michielmeulendijk.nl/custom">
<nativeNamespace>1</nativeNamespace>
<ctm:externalNamespace>2</ctm:customNamespace1>
</root>
<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时的错误/限制: 你为什么要用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>
借
我想不出您希望复制文档而不是直接使用它的任何可能原因。文档中没有externalNamespace元素。您能提供一个最小但完整的示例,让我们重现问题吗?使用名称空间前缀发布XSLT代码而不显示XSLT中的名称空间声明是毫无意义的。它应该是externalNamespace而不是customNamespace。我将开始准备一个完整的示例。我无法重现该问题。如果我修复了和之间的不匹配,并确保样式表具有将ctm前缀绑定到源XML中相同命名空间URI的命名空间声明,则第二次调用的结果是2。这是在使用libxslt。这可能是Xalan实现dyn时的缺陷/限制:评估不,它不能。阅读评论:只要添加名称空间声明,@michael.hor257k,它就可以正常工作。您说过您使用的是libxslt,而不是Xalan.Right。OP说,他们在添加了名称空间声明后也可以使用它:谢谢你的回答,但我认为这确实是由于在XSLT样式表中省略了名称空间声明造成的。我发现像这样的查询://*[name='ctm:exernalNamespace']可以在单独加载的文档上工作。@michielmelendijk,但正如Michael Kay所建议的,在代码中使用exsl:node set$xml doc确实可以完全避免。这样一来,您就不必首先创建结果树片段,也不必在对其使用XPath之前将其转换为节点集,直接从解析的输入中获得节点。