首页 > 解决方案 > 有没有一种简单的方法来初始化 XML 文件中的变量?

问题描述

有没有一种简单的方法来初始化 XML 文件中的变量,变量定义在外部纯文本文件中?

例如:

外部纯文本文件内部:

dbname="somedbname"

dburl="10.10.10.20:3306"

XML文件内部:

<property name="url" value="jdbc:mysql://{##dburl}/{##dbname}?autoreconnect=true&interactiveClient=true">

- 或者 -

<property name="url" value="jdbc:mysql://{$dburl}/{$dbname}?autoreconnect=true&interactiveClient=true">

我真的需要这个来为一个特殊的新项目工作,这将成为多个内部项目的基础,继续前进。

我可以通过一个典型的 shell 脚本轻松地做到这一点,只需在外部文本文件中进行采购。

有什么方法可以在 XML 文件中轻松做到这一点?

请记住,要完成这项工作,我必须能够从外部纯文本文件中获取变量。

在此先感谢您的帮助。

标签: xmlglobal-variables

解决方案


您可以使用实体,&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>

推荐阅读