0

我正在解组几个大型 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 属性赋值?

4

1 回答 1

2

您在{$var}这里混合了 XInclude、XSLT 和 ad-hoc 语法(不是 XML 的一部分)。您可以对 XInclude 元素中的值进行参数化的href方法是使用实​​体引用(XML 和 SGML 的文本替换变量机制等):

<xi:include href="&href-value;"/>

wherehref-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的内容common-part拉入实体,然后在内容中引用该值,XML 解析器将文档视为common-part(例如,存储在 中的任何内容long/common/part/of/partial/xml/file1)的替换值已直接在文档中指定。

希望这不会太令人困惑;在这个答案中有一个通用的解释 XML 和 SGML 中的实体是如何工作的

于 2019-06-10T10:50:46.527 回答