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"><!--</xsl:text> <!--*-->
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
<xsl:text disable-output-escaping="yes">--></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>
Проблема, похоже, вызвана линиями, отмеченными '*' в моей трансформации; более конкретно от вставки <!--
и -->
. Когда я удаляю эти два элемента, результат имеет отступ, как ожидалось.
Есть ли способ обернуть элементы в комментариях, сохраняя при этом выходной документ хорошо отформатированным?
Что произойдет, если вы добавите настоящий комментарий там, например. ' ... xsl: comment> xsl: template>', делает ли xsltproc тогда отступ содержимое элемента 'doc'? –
Отступ работает корректно при использовании 'xsl: comment', но, как вы, вероятно, знаете, только текстовые узлы разрешены внутри' xsl: comment'. 'xsltproc' не жалуется, но выводится' 'вместо'
' ' отсутствует, но в противном случае это, похоже, сработает. Я полагаю, что внешнюю зависимость от 'xml-to-string' непросто избежать? –
Markus
Ну, в ежедневном приложении я бы не рекомендовал вытаскивать его из Интернета для каждого использования, а вместо этого устанавливать локальную копию в файловой системе. Что касается подхода, я не знаю, позволяет ли xsltproc выполнять сериализацию с помощью функции расширения, поэтому вы можете избежать сериализации в XSLT. Разумеется, с простым содержимым, которое у вас есть (например, « foo »), может возникнуть соблазн сделать сериализацию с помощью нескольких шаблонов самостоятельно, но такие попытки затем рано или поздно производят некорректную сериализацию, и кто бы ни разбирался содержание комментария сталкивается с проблемами. –
Я бы предпочел не использовать какую-либо функцию расширения, поэтому я либо использую локальную копию 'xml-to-string', либо пересматриваю выполнение отступа во втором проходе. Большое спасибо за Вашу помощь! – Markus