Xslt 正在转换为打开和关闭标记对的XML空标记

Xslt 正在转换为打开和关闭标记对的XML空标记,xslt,Xslt,我有一个大型XML主配置文件,其中包含许多相互连接的应用程序的详细信息。大部分配置对所有应用程序都是通用的,但有些配置不同,例如IP地址、数据库连接字符串等 我将特定于特定应用程序的元素包含在一个条件元素中,并使用一个属性定义嵌套元素用于哪个应用程序。这允许我转换主配置文件以生成所需的特定于应用程序的配置文件 我遇到的问题是,输出XML具有表单的空标记元素 <add key="Setting3" value="1.2.3.4" /> 如果有更好的处理器,我想我可以切换到运行在Win

我有一个大型XML主配置文件,其中包含许多相互连接的应用程序的详细信息。大部分配置对所有应用程序都是通用的,但有些配置不同,例如IP地址、数据库连接字符串等

我将特定于特定应用程序的元素包含在一个条件元素中,并使用一个属性定义嵌套元素用于哪个应用程序。这允许我转换主配置文件以生成所需的特定于应用程序的配置文件

我遇到的问题是,输出XML具有表单的空标记元素

<add key="Setting3" value="1.2.3.4" />

如果有更好的处理器,我想我可以切换到运行在Windows上的任何其他免费可用的处理器。

我认为问题不在于您所展示的XSLT(尽管您可以尝试是否使用
可以改善情况),而在于您使用XSLT处理器运行转换的方式。因此,请考虑告诉我们使用哪个XSLT处理器,如果您有代码运行转换来显示代码。

< P>我认为问题不在您已经显示的XSLT(尽管您可以尝试使用<代码> <代码>改进事情),而应该使用XSLT处理器运行转换的方式。因此,请考虑告诉我们使用哪个XSLT处理器,如果您有代码运行转换来显示代码。

这有助于将结束标记移到与打开标记相同的行上,这样就减少了差异,但仍然存在格式更改。我编辑了我的原始帖子,加入了我正在使用的处理器。谢谢我担心空元素是否标记为
与XML无关,通常也不是XSLT处理器可以控制的。任何用于XML的diff工具都不应该在纯粹的词法基础上工作,而应该使用XML解析器并查看语义。至于MSXML,我不知道如何将其配置为对空元素使用特定的序列化格式,而保留结果中输入的任何格式更为困难,因为XSLT数据模型肯定不会存储任何此类信息。感谢Martin的帮助。虽然这并没有解决我的问题,但我现在有了更好的理解,因此我已将您的答案标记为正确。这有助于将结束标记移动到与开始标记相同的行上,从而减少差异,但仍然存在格式更改。我编辑了我的原始帖子,加入了我正在使用的处理器。谢谢我担心空元素是否标记为
与XML无关,通常也不是XSLT处理器可以控制的。任何用于XML的diff工具都不应该在纯粹的词法基础上工作,而应该使用XML解析器并查看语义。至于MSXML,我不知道如何将其配置为对空元素使用特定的序列化格式,而保留结果中输入的任何格式更为困难,因为XSLT数据模型肯定不会存储任何此类信息。感谢Martin的帮助。虽然这并没有解决我的问题,但我现在有了更好的理解,所以我已将您的答案标记为正确。
<add key="Setting3" value="1.2.3.4">
</add>
<?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>
<add key="Setting3" value="1.2.3.4" />
<add key="Setting3" value="1.2.3.4"></add>
msxml.exe master.config config.xslt app=App1 > App1.config
msxml.exe master.config config.xslt app=App2 > App2.config