Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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/8/xslt/3.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 XSLT-将文档作为参数传递给不起作用的模板_Xml_Xslt - Fatal编程技术网

Xml XSLT-将文档作为参数传递给不起作用的模板

Xml XSLT-将文档作为参数传递给不起作用的模板,xml,xslt,Xml,Xslt,我使用xsl样式表将来自两个不同xml文件的数据放在一起。 当我在主模板中从另一个xml文件中筛选正确的DOM时,我希望将该DOM传递给另一个模板,以便只返回所需的信息。 但这里是我结巴的地方,因为我似乎无法用“xsl:with-param”传递DOM结构。在子模板中尝试输出时,传递的参数为空 <xsl:variable name="data" select="/entry/document('data.xml')/documents" /> <xsl:template ma

我使用xsl样式表将来自两个不同xml文件的数据放在一起。 当我在主模板中从另一个xml文件中筛选正确的DOM时,我希望将该DOM传递给另一个模板,以便只返回所需的信息。 但这里是我结巴的地方,因为我似乎无法用“xsl:with-param”传递DOM结构。在子模板中尝试输出时,传递的参数为空

<xsl:variable name="data" select="/entry/document('data.xml')/documents" />

<xsl:template match="/">
    <xsl:param name="matchingNodes" select="$data/document[documentInfos/documentInfo[documentInfoField = '120']/content/value = current()/ARTICLE]"/>

    <xsl:if test="count($matchingNodes)">
        <xsl:call-template name="PRODUCT_NAME">
            <xsl:with-param name="matchingNodes" select="$matchingNodes"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

<xsl:template name="PRODUCT_NAME"/>
  <xsl:param name="matchingNodes"/> <-- this is empty
  ...
</xsl:template>


你有几个问题。首先,您的
$data
变量为空。您可以通过运行以下测试来验证这一点:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:variable name="data" select="document('data.xml')/documents" />

<xsl:template match="/">
    <test>
        <xsl:copy-of select="$data"/>
    </test>
</xsl:template>

</xsl:stylesheet>

它是空的,因为
data.xml
的根元素是
entry
,而不是
documents
。而且还因为data.xml不是格式良好的xml文档(至少不是您在这里发布的示例)

此外,选择
$matchingNodes
变量的表达式也不选择任何内容-至少在提供的示例中不选择。例如,表达式
current()/ARTICLE
将始终为空,因为
ARTICLE
不是当前
/
节点的子节点。而
value
的路径也是错误的


不幸的是,我无法为您解决这个问题,因为我不知道
data.xml
文档实际上是什么样子的。或者你到底想达到什么目的。

我不知道该如何评价这一点。我使用氧气作为工具来构建样式表。左上角有一个选择器,上面写着Saxon PE 9.8.0.12。那是版本吗?是的,听起来不错。我不认为那个引擎会有什么奇怪的问题。是否确实正在调用产品名称模板?你是怎么观察到的?@JLRishe也许,也许不是。我不会在
中添加任何没有.@Timo.Klement的内容,
current()/ARTICLE
将引用不存在的节点<在这种情况下,code>current()
将是XML文档的根,它的唯一子级是
您显示的代码看起来不错。你关于它为什么不起作用的理论看起来是错误的。这个bug可能是你没有展示给我们的东西,因为你认为它不相关。这说明了提供著名的“最小可复制示例”的重要性:我们实际上可以在自己的空间中运行和调试它。我非常抱歉。你是对的。我试图缩短data.xml,使其没有太多信息,并将两个节点和文章值弄乱。它现在固定在主线程中,现在只有一个匹配第一篇文章。在“count”表达式中选择$matchingNodes仅用于确定是否至少有一个。我建议您在新问题中发布一个新问题。提示:使用从交叉引用的节点获取数据。
<xsl:template name="PRODUCT_NAME"/>
  <xsl:param name="matchingNodes"/>
  <xsl:value-of select="$matchingNodes"/>
</xsl:template>
<xsl:template match="documentInformationEntry[documentInformationField = '100']/content[language = 'de']/value>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:variable name="data" select="document('data.xml')/documents" />

<xsl:template match="/">
    <test>
        <xsl:copy-of select="$data"/>
    </test>
</xsl:template>

</xsl:stylesheet>