2

问题的快速概述:我正在使用 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

也许我走错了路,任何形式的帮助都将不胜感激,请提前

UPDATE 1 -works:使用 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) 在重新声明后工作。感谢大家的时间帮助!

4

1 回答 1

2

我认为您的问题是相对 URI 的基础。当 document() 的参数被评估为字符串时,基本 URI 是样式表。当 document() 的参数被评估为节点时,基本 URI 是节点的基本 URI。

您已经以一种被 document() 函数用作字符串的方式声明了该变量:作为结果树片段。

如果您使用select="some_node"而不是子变量声明变量,xsl:value-of则会将参数的数据类型更改为 document() 函数,这会更改评估的基本 URI,这可能会更改结果。

否则,您的第一行是正确的: document($variable)

于 2013-08-30T11:19:57.487 回答