Пустой тег XML преобразуется в открытую и закрывающую пару тегов - PullRequest
1 голос
/ 28 сентября 2011

У меня есть большой главный файл конфигурации XML, который содержит подробную информацию о ряде взаимосвязанных приложений.Большая часть конфигурации является общей для всех приложений, но некоторые части отличаются, например, IP-адреса, строки подключения к базе данных и т. Д.

Я заключил элементы, относящиеся к конкретному приложению, в условное условное element и атрибут используются для определения того, для какого приложения используются вложенные элементы.Это позволяет мне преобразовать главный файл конфигурации для создания необходимого файла конфигурации приложения.

Проблема, с которой я сталкиваюсь, состоит в том, что выходной 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: 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 Ответ

1 голос
/ 28 сентября 2011

Я думаю, что проблема не в XSLT, который вы показали (хотя вы можете попробовать, улучшит ли использование <xsl:output method="xml" indent="no" version="1.0" encoding="utf-8"/>), а в том, как вы выполняете преобразование с вашим процессором XSLT. Поэтому расскажите нам, какой процессор XSLT вы используете, и если у вас есть код, выполняющий преобразование, чтобы показать нам код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...