xml - 有没有一种简单的方法来初始化 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 文件中轻松做到这一点?
请记住,要完成这项工作,我必须能够从外部纯文本文件中获取变量。
在此先感谢您的帮助。
解决方案
您可以使用实体,&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>
推荐阅读
- c# - 使用 C# 设置 Excel 单元格值
- qsqlquery - 交叉播放查询
- vba - 将具有相同标题和唯一 ID 的多个 Excel 工作表合并
- angular - “画布不是构造函数”错误 - 使用带有 Angular 6 的 FabricJS
- html - 只有部分按钮可点击
- analytics - 如何在 Tealium 中配置 Vzaar 视频跟踪
- android - WebView 片段上的后退按钮 - 不会转到上一页
- python - 如何通过一个请求使用 Django 应用程序路由索引?
- java - Java 8 lambda 大括号是强制性的吗?
- mysql - 具有“OR”条件的 MySQL 优化连接查询