参数化部分 xml 属性值

paremetrize part of xml attribute value

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

您在这里混合了 XInclude、XSLT 和 ad-hoc {$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 中的实体是如何工作的一般解释