将XML空标记转换为打开和关闭标记对
问题描述:
我有一个很大的XML主配置文件,其中包含大量相互连接的应用程序的详细信息。多的结构是共同的所有应用程序,但一些片不同,如IP地址,数据库连接字符串等将XML空标记转换为打开和关闭标记对
我所包围的元件特定于特定应用的条件元件内,并使用的属性定义嵌套元素用于哪个应用程序。这使我可以转换主配置文件来生成所需的特定于应用程序的配置文件。
我遇到的问题是输出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>
由于
编辑:
更改XML:输出如马丁建议改善输出关闭标签现在附加到同一行上的开始标签,但我仍然希望它保留源XML文件的空标签格式。
所以
<add key="Setting3" value="1.2.3.4" />
成为
<add key="Setting3" value="1.2.3.4"></add>
我使用微软的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上运行的其他免费可用处理器。
答
我认为问题不在于您已经显示的XSLT(尽管您可以尝试使用<xsl:output method="xml" indent="no" version="1.0" encoding="utf-8"/>
是否改善了事情),而是以您使用XSLT处理器运行转换的方式。因此,请考虑告诉我们您使用的是哪个XSLT处理器,并且如果您有运行转换的代码来向我们显示代码。
这有助于将结束标记移动到与开始标记相同的行上,这样可以减少差异,但仍然会进行格式更改。我编辑了我的原始帖子以包含我正在使用的处理器。谢谢 –
我担心一个空元素是否被标记为' '或' '或' '对于XML来说并不重要,而且通常不是您可以用XSLT处理器控制的东西。对于XML的任何diff工具都不应该在纯粹的词法基础上工作,而应该使用XML解析器并查看语义。至于MSXML,我不知道如何将其配置为对空元素使用某种序列化格式,并且在结果中保留输入中的任何格式更加困难,因为XSLT数据模型确实不会存储任何此类信息。 –
感谢您的帮助马丁。虽然这并没有解决我的问题,但我现在有了更好的理解,所以我已将您的答案标记为正确。 –