解析xml属性值的一部分

时间:2019-06-10 08:46:15

标签: java xml jaxb xinclude

我正在整理两个大型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属性?

1 个答案:

答案 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

有一个一般性的解释