是否有一种简单的方法来初始化XML文件中的变量,并在外部纯文本文件中定义变量?
例如:
在外部纯文本文件中:
dbname =“ somedbname”
dburl =“ 10.10.10.20:3306”
在XML文件内部:
<属性名称=“ url”值=“ jdbc:mysql:// {## dburl} / {## dbname}?autoreconnect = true&amp; interactiveClient = true”>
-或-
<属性名称=“ url”值=“ jdbc:mysql:// {$ dburl} / {$ dbname}?autoreconnect = true&amp; interactiveClient = true”>
我真的需要这个来为一个特殊的新项目工作,该项目将成为今后多个内部项目的基础。
通过简单地在外部文本文件中采购,我可以从典型的shell脚本轻松地做到这一点。
是否可以通过某种方式在XML文件中轻松完成此操作?
请记住,要使此工作有效,我必须能够从外部纯文本文件中获取变量。
预先感谢您的帮助。
答案 0 :(得分:0)
您可以使用诸如&dbname;
之类的实体,但这是一种笨拙的机制,因为它们必须在DTD中声明。
更好的方法可能是XSLT:
<xsl:stylesheet .....>
<xsl:param name="dbname"/>
<xsl:param name="dburl"/>
<xsl:template match="/">
<parameter-doc>
<property name="url" value="jdbc:mysql://{$dburl}/{$dbname}?autoreconnect=true&interactiveClient=true">
</parameter-doc>
</xsl:template>
</xsl:stylesheet>
运行此样式表(在任何源文档上,或在没有源文档的2.0+中),它将吐出带有扩展变量的参数文档。
或者(响应您的评论),如果要使XML文件易于编辑,则可以编写一个样式表,该样式表采用XML配置文件并插入环境变量的值,如下所示:
<xsl:stylesheet version="3.0"...>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="@*[contains(., '{$')]">
<xsl:variable name="regex">\{\$([a-z]+)\}</xsl:variable>
<xsl:attribute name="name(.)">
<xsl:analyze-string select="." regex="{$regex}">
<xsl:matching-substring>
<xsl:value-of select="environment-variable(regex-group(1))"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>