想象一下,当你有大约 10+ 个几乎相同的多个环境的大型 XML 配置文件时。
有时您必须添加一个新选项,这会导致使用相同的数据修改所有这些 10..20..30+ 文件。
你犯错误。与其他分支合并时会出现冲突。你变得紧张和沮丧。
有没有好的工具可以为纯XML文件(不是Spring.cgf或POM(提供继承之类的东西?
或者我必须自己写一个蚂蚁或 maven 自行车脚本?
您可以使用实体/实体引用在文件内或跨文件的多个位置引用和重用内容。
声明和使用实体的 XML 文件如下所示:
<!DOCTYPE doc [
<!ENTITY myent "<x>Text content of myent</x>">
]>
<doc>
&myent;
&myent;
</doc>
此 XML 文件的处理方式就好像
<doc>
<x>Text content of myent</x>
<x>Text content of myent</x>
</doc>
已指定。也就是说,实体引用&myent;
替换为其替换文本<x>Text content of myent</x>
。
这也适用于存储在外部文件(称为外部实体(中的替换文本。假设上面的文件存储为 doc.xml
,您可以从另一个 XML 文件中引用它,如下所示:
<!DOCTYPE otherdoc [
<!ENTITY doc SYSTEM "doc.xml">
]>
<otherdoc>
&doc;
</otherdoc>
XML 解析器会将其视为
<otherdoc>
<doc>
<x>Text content of myent</x>
<x>Text content of myent</x>
</doc>
</otherdoc>
已指定。
使用实体,您可以组织公共 XML 内容,而不会在文件内或文件之间产生冗余。希望有帮助。
编辑:请注意,您必须调整 DOCTYPE - 它必须与 XML 的文档元素匹配
您可以维护一个生成多个配置文件的 XSLT 脚本,如下所示:
<xsl:transform version='3.0' expand-text='true'....>
<xsl:variable name="outputs" as="element(output)*">
<output file="config1.xml" os="mac" db="oracle"/>
<output file="config2.xml" os="windows" db="mysql"/>
</xsl:variable>
<xsl:template name="main">
<xsl:for-each select="$outputs">
<xsl:result-document href="{$file}">
<config>
<aspiration>high</aspiration>
<perspiration>low</perspiration>
<condensation>{if (@db='oracle') then 'moderate' else 'none'}</condensation>
<xsl:if test="@os='linux'>
<permutation>inverse</permutation>
</xsl:if>
</config>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:transform>
然后,当有更改时,只需编辑样式表并重新运行它。
或者,您可以使用条件标记创建配置文件,如下所示:
<config>
<perspiration>high</perspiration>
<exhumation for-os="linux">mediocre</exhumation>
<exhumation for-os="windows">none</exhumation>
...
</config>
然后编写样式表,通过删除不适用的元素来对其进行子集化。