Я хочу распечатать свой вывод 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>
Для того чтобы убрать все, что похоже на "отступы", может потребоваться (то есть бывают случаи, когда это необходимо) использовать и
и``indent="no"``.
Возьмем самый простой пример: у вас есть преобразование тождества. Если не указать ни один из двух методов, преобразование будет воспроизводить текстовые узлы с белым пробелом только из исходного XML-документа. То есть, если исходный XML-документ имеет отступы, преобразование также выдаст результат с отступами.
Теперь добавьте к этому преобразованию
. Это указывает XSLT-процессору не выполнять "красивую печать". Тем не менее, узлы из исходного XML-документа, содержащие только пробельные символы, по-прежнему копируются в выходной документ, и результирующий документ выглядит по-прежнему с отступом (потому что исходный документ имеет отступ).
Теперь, в качестве последнего шага, добавьте
. Вы указали оба способа предотвращения появления в выводе узлов, содержащих только белые пробелы. Что происходит? XSLT-процессор вообще не обрабатывает узлы, содержащие только белые пробелы, и не делает отступов в выводе - вы получаете желаемый однострочный плотный вывод.
Наконец, сделайте регрессию, измените
на
.
все еще присутствует, поэтому в выводе не воспроизводятся узлы, содержащие только пробельные символы. Но XSLT-процессор подчиняется директиве
и добавляет свои собственные текстовые узлы только с пробелами.
Таким образом, из четырех возможных комбинаций только указание и
, и
гарантирует, что отступы не будут вызваны ни узлами с пробелами из исходного XML-документа, ни инициативой XSLT-процессора.
Даже этот последний случай, конечно, не гарантирует полностью, что на выходе не будет отступов -- если программист XSLT намеренно поместит туда код отступов, такой как
то на выходе будет присутствовать этот отступ.
Лучше всего измерить разницу в производительности. Реализации процессоров XSLT различаются, и вам следует провести тест самостоятельно (хотя я подозреваю, что беспокойство о производительности того или другого может в этом случае попасть в категорию «преждевременной оптимизации»).
может не иметь желаемого эффекта, если не сопровождается
<xsl:template match="text(normalize-space()='')" />
, потому что если узлы-пробелы (те, которые находятся между вашими тегами) не удалить, то они появятся в вывод в какой-то момент, независимо от настройки «вывода».