Как я могу получить xslt для отступа xml (от Ant)? - PullRequest
2 голосов
/ 21 декабря 2011

Из того, что я понимаю, посмотрев ответ на этот вопрос, должно сработать следующее:

<xslt basedir="..." destdir="..." style="xslt-stylesheet.xsd" extension=".xml"/>

Где xslt-stylesheet.xsd содержит следующее:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

К сожалению, покаприменяется большая часть форматирования (пробелы удаляются, вводятся новые строки и т. д.), отступа нет, и каждый элемент находится в левой части файла.Это проблема с процессором xslt, который использует Ant, или я делаю что-то не так?(Использование Ant 1.8.2).

Ответы [ 4 ]

5 голосов
/ 22 декабря 2011

Это может помочь установить некоторые параметры вывода для конкретного процессора, хотя следует помнить, что они могут различаться в зависимости от используемого вами процессора XSLT.

Например, если вы используете Xalan,он определяет свойство indent-amount, которое, по-видимому, по умолчанию равно 0.

Чтобы переопределить это свойство во время выполнения, вы можете объявить пространство имен xalan в своей таблице стилей и переопределить, используя специфичный для процессора атрибут indent-amount в своих выходных данныхэлемент следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              xmlns:xalan="http://xml.apache.org/xalan">

  <xsl:output method="xml" 
              encoding="UTF-8"
              indent="yes" 
              xalan:indent-amount="2"/>

Этот пример взят из документации по шаблонам использования Xalan по адресу http://xml.apache.org/xalan-j/usagepatterns.html

Если вы действительно используете Xalan, в документации также сказано, что вы можете изменить всеглобальные настройки вывода путем установки изменения файла org / apache / serializer / output_xml.properties в банке сериализатора.

В интересах полноты полный набор специфичных для Xalan выходных свойств xml, определенных в этом файле (Xalan 2.7.1):

{http://xml.apache.org/xalan}indent-amount=0
{http://xml.apache.org/xalan}content-handler=org.apache.xml.serializer.ToXMLStream
{http://xml.apache.org/xalan}entities=org/apache/xml/serializer/XMLEntities

Если вы не используете Xalan, вам может повезтиищем некоторые специфичные для процессора выходные свойства в документации к вашему процессору XSLT

1 голос
/ 21 декабря 2011

Различные процессоры XSLT по-разному реализуют indent="yes" .Некоторые отступы правильно, в то время как другие только помещают элемент, начинающийся с новой строки.Кажется, что ваш XSLT-процессор относится к последней группе.

Почему это так ?

Причина в том, что W3C XSLT Спецификация допускает значительную свободу действий при создании отступа:

"Если атрибут indent имеет значение yes, то метод вывода xml может выводить пробелы в дополнение к пробелам в дереве результатов (возможно, на основе пробелов, извлеченных из исходного документа или таблицы стилей) для правильного отступа результата: если атрибут indent имеет значение no, он не долженвыведите любой дополнительный пробел. Значение по умолчанию - no. Метод вывода xml должен использовать алгоритм для вывода дополнительного пробела, который гарантирует, что результат, если пробельные символы должны быть удалены из вывода, использует процесс, описанный в [3.4 Удаление пробелов снабор элементов, сохраняющих пробелы, состоящий из всего xsl:text, будет таким же, когда дополнительныеTespace выводится так же, как когда дополнительные пробелы не выводятся.

ПРИМЕЧАНИЕ : Обычно небезопасно использовать indent="yes" с типами документов, которые включают типы элементов со смешанным содержимым. "

Возможные решения :

  1. Начните использовать другой XSLT-процессор.Например, саксонские отступы достаточно хороши.

  2. Удалите директиву <xsl:strip-space elements="*"/>.Если в исходном XML есть текстовые узлы только для пробелов, они будут скопированы в выходные данные, что может привести к получению более качественного отступа.

0 голосов
/ 01 июня 2015

Вы можете попробовать добавить свойство вывода {http://xml.apache.org/xslt}indent-amount в ant, как-то так:

<target name="applyXsl">
    <xslt in="${inputFile}" out="${outputFile}" extension=".html" style="${xslFile}" force="true">
        <outputproperty name="indent" value="yes"/>
        <outputproperty name="{http://xml.apache.org/xslt}indent-amount" value="4"/>
    </xslt>
</target>
0 голосов
/ 21 декабря 2011

Я не знаю, в порядке ли муравей.Но что касается вашего XSLT:

Когда вы используете copy-of для элемента, ваш процессор XSLT не делает отступ.Если вы измените свой XSLT следующим образом, ваш XSLT-процессор сможет сделать отступ:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Этот XSLT будет проходить через все дерево XML и отступать для каждого создаваемого им элемента.

РЕДАКТИРОВАТЬ после комментария:

Вы можете увидеть следующий вопрос, чтобы изменить ваш XSLT-процессор, возможно, это решит вашу проблему: Как запустить XSLT 2.0 с помощью ant?

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