XML空标记被转换为打开和关闭标记对

时间:2011-09-28 13:23:39

标签: xslt

我有一个大型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上运行的任何其他免费提供的处理器。

1 个答案:

答案 0 :(得分:1)

我认为问题不在于您所展示的XSLT(尽管您可以尝试使用<xsl:output method="xml" indent="no" version="1.0" encoding="utf-8"/>改进),而是使用XSLT处理器运行转换的方式。因此,请考虑告诉我们您使用哪个XSLT处理器,以及是否有运行转换的代码向我们展示代码。