Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml EXSLT dyn:使用命名空间进行计算_Xml_Xslt_Xalan_Exslt - Fatal编程技术网

Xml EXSLT dyn:使用命名空间进行计算

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

在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>
<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之前将其转换为节点集,直接从解析的输入中获得节点。