问题快速概述:我正在使用 xslt 1.0 转换 xml,其中 xml 是具有 url 的节点。使用 xsl 1.0,我可以获取这些节点值,当我获取这些值时,我需要使用它们从 xslt 加载另一个 xml 文件,如果我通过 document() 函数手动使用这些节点值,它就可以工作,但我需要自动执行。
在 xslt 中加载外部 xml 非常简单:
<xsl:copy-of select="document('URL_OF_XML')/node1/node2"/>
它按预期工作。
但是如果我的外部 xml 的 url 存储在变量中,例如:
<xsl:variable name="MY_VARIABLE">
<xsl:value-of select="some_node_containing_url"/>
</xsl:variable>
<xsl:copy-of select="document('HOW_TO_USE_VARIBALE_VALUE_HERE') />
我已经尝试过:
<xsl:copy-of select="document($MY_VARIABLE)" /> -> works after see UPDATE 2 below
<xsl:copy-of select="document('$MY_VARIABLE')" /> nothing happend
<xsl:copy-of select="document({$MY_VARIABLE})" /> nothing happend, ofc {} are for attributes
<xsl:copy-of select="document('<xsl:value-of select="MY_VARIABLE"/>')" /> we cant use "<" ">" in document function
也许我走错了路,提前提供任何形式的帮助将不胜感激
更新 1 -有效: 使用 concat 并在我的变量中添加一个空字符串,如下所示:
<xsl:copy-of select="document(concat('',$MY_VARIABLE))"/>
更新 2 -有效: 关注@G. Ken Holman 建议我重新声明我的变量:
<xsl:variable name="MY_VARIABLE">
<xsl:value-of select="some_node_containing_url"/>
</xsl:variable>
至:
<xsl:variable name="MY_VARIABLE" select="some_node" />
然后调用我的副本:
<xsl:copy-of select="document($MY_VARIABLE)"/>
以及所有作品。感谢您的帮助和建议! 结论:唯一的问题是我的变量声明,现在 document() 函数接受对 $MY_VARIABLE 的所有调用,不需要 concat,但也可以工作,并且 string($MY_VARIABLE) 在重新声明后可以工作。感谢大家抽出时间提供帮助!
最佳答案
我认为你的问题是相对 URI 的基础。当 document() 的参数被计算为字符串时,基本 URI 就是样式表。当 document() 的参数被评估为节点时,基本 URI 是该节点的基本 URI。
您已通过 document() 函数将变量用作字符串来声明该变量:作为结果树片段。
如果您使用 select="some_node"
而不是子 xsl:value-of
声明变量,则会更改文档参数的数据类型( ) 函数,它会更改评估的基本 URI,这可能会更改结果。
否则,您的第一行是正确的:document($variable)
关于xml - 使用 document() 函数在 xslt 1.0 中加载外部 xml,但将文档的 url 作为变量传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18530588/