我有一个大型XML主配置文件,其中包含许多互连应用程序的详细信息。大多数配置对所有应用程序都是通用的,但有些部分不同,例如IP地址,数据库连接字符串等。
我在条件元素中包含了特定应用程序的特定元素,并且属性用于定义嵌套元素用于哪个应用程序。这允许我转换主配置文件以生成所需的特定于应用程序的配置文件。
我遇到的问题是输出XML具有表单
的空标记元素<add key="Setting3" value="1.2.3.4" />
更改为
<add key="Setting3" value="1.2.3.4">
</add>
虽然我理解这并不重要,但是使用当前特定于应用程序的文件来区分生成的XML文件会更加困难,这些文件都是手工创建的。我可以对xslt做些什么来保持结果中的空标记不变?
我的xslt如下
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="app" select="''"></xsl:param>
<xsl:output method="xml" indent="yes" version="1.0" encoding="utf-8"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*|comment()|processing-instruction()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="conditional">
<xsl:if test="starts-with(@app,$app))">
<xsl:copy-of select="*|@*|comment()|processing-instruction()"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
示例主配置文件如下
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- Common Settings for all applications -->
<add key="Setting1" value="1000" />
<add key="Setting2" value="600" />
<conditional app="App1">
<!-- App1 Settings -->
<add key="Setting3" value="1.2.3.4" />
</conditional>
<conditional app="App2">
<!-- App2 Settings -->
<add key="Setting3" value="1.3.10.10" />
</conditional>
</configuration>
由于
编辑:
如Martin建议的那样改变 xml:output 可以改善输出,因为结束标记现在被附加到同一行的开始标记,但是我仍然希望保持空标记源XML文件的格式。
所以
<add key="Setting3" value="1.2.3.4" />
变为
<add key="Setting3" value="1.2.3.4"></add>
我正在使用Microsoft的msxml.exe 3.0版,如下所示
msxml.exe master.config config.xslt app=App1 > App1.config
msxml.exe master.config config.xslt app=App2 > App2.config
如果有更好的处理器我怀疑我可以切换到在Windows上运行的任何其他免费提供的处理器。
答案 0 :(得分:1)
我认为问题不在于您所展示的XSLT(尽管您可以尝试使用<xsl:output method="xml" indent="no" version="1.0" encoding="utf-8"/>
改进),而是使用XSLT处理器运行转换的方式。因此,请考虑告诉我们您使用哪个XSLT处理器,以及是否有运行转换的代码向我们展示代码。