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