使用document()函数在xslt 1.0中加载外部xml,但将document的url作为变量传递

时间:2013-08-30 10:22:37

标签: xml function xslt external document

问题的快速概述:Iam使用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 -works: 使用concat并将空字符串添加到我的变量,如:

<xsl:copy-of select="document(concat('',$MY_VARIABLE))"/>

更新2 -works: 关注@G。肯霍尔曼建议我重新开始我的变量:

<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的所有调用,不需要连接,但也可以工作,并且字符串($ MY_VARIABLE)在重新声明后工作。感谢大家的帮助!

1 个答案:

答案 0 :(得分:2)

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

你已经通过document()函数将变量用作字符串来声明变量:作为结果树片段。

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

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