有没有一种简单的方法可以在XML文件中初始化变量?

时间:2020-08-28 14:03:10

标签: xml global-variables

是否有一种简单的方法来初始化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文件中轻松完成此操作?

请记住,要使此工作有效,我必须能够从外部纯文本文件中获取变量。

预先感谢您的帮助。

1 个答案:

答案 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&amp;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>