Каков наилучший подход для удаления избыточных пробелов в XML [strip-space или indent = "no"]? - PullRequest
7 голосов
/ 26 февраля 2010

Я хочу напечатать свой выходной XML в одну строку [при просмотре в блокноте или другом простом текстовом редакторе], чтобы удалить лишние пробелы в моем XML-файле. Так какой же лучший метод для этого ??

Я думаю, что есть два варианта,
1) Для использования

  <xsl:output method="xml" indent="no"/>

2) или использовать

  <xsl:strip-space elements="*"/>

Что эффективнее и почему?
некоторые люди предлагают мне использовать indent="no",

Я считал, что стрип-пространство лучше всего подходит, но не уверен из-за предложений, высказанных другими.

Чтобы быть более проработанным, позвольте мне привести пример:
Входной XML:

<root>
 <node>
   <child1/>
   <child2/>
 </node>
</root>

и требуемый вывод:

<root><node><child1/><child2/></node></root>

Ответы [ 2 ]

12 голосов
/ 26 февраля 2010

Для устранения чего-либо, похожего на «отступ», может потребоваться (это означает, что в некоторых случаях вам нужно) использовать оба <xsl:strip-space> и `` отступа = "нет" `.

Возьмите простейший пример : у вас есть преобразование идентичности. Без какого-либо из указанных двух методов преобразование будет воспроизводить текстовые узлы только для пробелов из исходного XML-документа. То есть, если исходный документ XML имеет отступ, преобразование также даст результат с отступом.

Теперь добавьте к этому преобразованию <xsl:output indent="no" />. Это дает указание процессору XSLT не выполнять собственную "красивую печать". Однако узлы, содержащие только пробелы, из исходного XML-документа по-прежнему копируются в выходной документ, а итоговый документ выглядит по-прежнему с отступом (поскольку исходный документ имеет отступ).

Теперь, в качестве последнего шага, добавьте <xsl:strip-space elements="*"/>. Вы указали оба метода предотвращения появления узлов только для пробелов в выходных данных. Что просходит? Процессор XSLT вообще не обрабатывает узлы только с пробелами, и он не выравнивает вывод - вы получаете желаемый однострочный плотный вывод.

Наконец, сделайте регрессию, измените <xsl:output indent="no" /> на <xsl:output indent="yes" />. <xsl:strip-space elements="*"/> все еще там, так что никакие узлы только для пробелов не воспроизводятся в выходных данных. Но процессор XSLT подчиняется директиве <xsl:output indent="yes" /> и добавляет собственные текстовые узлы только для пробелов.

Таким образом, из четырех возможных комбинаций только указание обоих <xsl:strip-space elements="*"/> и <xsl:output indent="no" /> гарантирует, что отступы не будут вызываться ни узлами только для пробелов из исходного XML документ или от инициативы процессоров XSLT.

Даже этот последний случай, конечно, не полностью гарантирует, что вывод не будет иметь отступ - если программист XSLT преднамеренно поместит туда код отступа, такой как

<xsl:text>

</xsl:text>

вывод будет содержать этот отступ.

2 голосов
/ 26 февраля 2010

Различия в производительности лучше всего измеряются. Реализации процессора XSLT различаются, и вы должны выполнить тест для себя (хотя я подозреваю, что беспокойство по поводу производительности одного или другого в этом случае может попасть в категорию «преждевременной оптимизации»).

<xsl:output indent="no" /> может не дать желаемого эффекта, если не сопровождается

<xsl:template match="text(normalize-space()='')" />

потому что, если пробельные узлы (те, что находятся между вашими тегами) не удаляются, то в какой-то момент они появятся в выходных данных, независимо от настройки «output».

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