我正在整理两个大型XML文件。
它们具有公共部分,我决定将公共部分写入单独的XML文件中,然后使用xi:include
标签将其包括在内。
看起来像这样:
<tag1>
<tag2>
</tag2>
<tag3>
</tag3>
<xi:include href = "long/common/part/of/partial/xml/file1"/>
<xi:include href = "long/common/part/of/partial/xml/file2"/>
</tag1>
此刻,我想参数化long/common/part
。
我试图像这样使用xsl:variable
定义变量
<xsl:variable name="test">
"long/common/part/of/partial/xml/"
</xsl:variable>
,但是为href分配值是一个问题,
<xi:include href = "{$test}"/>
或
<xi:include href = <xsl:value-of select="test"/>
不起作用。 有没有一种方法可以将值分配给XML属性?
答案 0 :(得分:2)
您在这里混合使用XInclude,XSLT和临时{$var}
语法(不是XML的一部分)。您可以 参数化XInclude元素中的href
值的方法是使用实体引用(XML和SGML的机制用于文本替换变量):
<xi:include href="&href-value;"/>
其中href-value
必须以编程方式或(最好)通过在序言中声明的方式绑定到字符串long/common/part/of/partial/xml/file1
,例如:
<!DOCTYPE tag1 [
<!ENTITY href-value "long/common/part/of/partial/xml/file1">
]>
<tag1>
<xi:include href = "&href-value;"/>
</tag1>
但是,由于现在无论如何您都在使用实体引用,因此仅使用实体就可以实现相同的目的,而根本不需要XInclude:
<!DOCTYPE tag1 [
<!ENTITY common-part SYSTEM "long/common/part/of/partial/xml/file1">
]>
<tag1>
&common-part;
</tag1>
这会将long / common / part / of / partial / xml / file1的 content 拉入common-part
实体,然后在内容中引用该值,而XML解析器将就像直接在文档中指定common-part
的替换值(例如long/common/part/of/partial/xml/file1
中存储的任何内容)一样。
希望这不太令人困惑;关于XML和SGML中的实体如何工作in this answer
有一个一般性的解释