2016-05-13 2 views
0

Использование XSLT 1.0 Я хотел бы прокомментировать некоторые элементы XML и заменить другие элементы XML, сохранив при этом XML-код в хорошем формате.xsl: strip-space в сочетании с xsl: text messes up automatic indentation

Например, следующий документ XML

<doc> 
    <e1>foo</e1> 
    <e2>bar</e2> 
</doc> 

должны быть преобразованы в

<doc> 
    <!--<e1>foo</e1>--> 
    <e3>foobar</e3> 
    <e4>foobar</e4> 
</doc> 

Я использую следующее преобразование XSL и xsltproc для тестирования:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="e1"> 
    <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> <!--*--> 
    <xsl:copy> 
     <xsl:apply-templates /> 
    </xsl:copy> 
    <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> <!--*--> 
    </xsl:template> 

    <xsl:template match="e2"> 
    <e3>foobar</e3><e4>foobar</e4> 
    </xsl:template> 

</xsl:stylesheet> 

Но что я получаю это:

<doc><!--<e1>foo</e1>--><e3>foobar</e3><e4>foobar</e4></doc> 

Проблема, похоже, вызвана линиями, отмеченными '*' в моей трансформации; более конкретно от вставки <!-- и -->. Когда я удаляю эти два элемента, результат имеет отступ, как ожидалось.

Есть ли способ обернуть элементы в комментариях, сохраняя при этом выходной документ хорошо отформатированным?

+0

Что произойдет, если вы добавите настоящий комментарий там, например. ' ...', делает ли xsltproc тогда отступ содержимое элемента 'doc'? –

+0

Отступ работает корректно при использовании 'xsl: comment', но, как вы, вероятно, знаете, только текстовые узлы разрешены внутри' xsl: comment'. 'xsltproc' не жалуется, но выводится' 'вместо'

+0

'' отсутствует, но в противном случае это, похоже, сработает. Я полагаю, что внешнюю зависимость от 'xml-to-string' непросто избежать? – Markus

+0

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

+0

Я бы предпочел не использовать какую-либо функцию расширения, поэтому я либо использую локальную копию 'xml-to-string', либо пересматриваю выполнение отступа во втором проходе. Большое спасибо за Вашу помощь! – Markus

Смежные вопросы