Сохранение отступа исходного документа в результирующем документе в XSLT - PullRequest
0 голосов
/ 27 марта 2020

Я использовал редактор Oxygen XML для своих XSL-преобразований (Saxon-HE 9.8.0.8 в таблицах стилей XSL v. 2), и отступы исходного и конечного документов были одинаковыми: это то, что мне нужно.

Когда я запускаю XSLT из командной строки (Saxon-HE 9.8.011J, Java версия 1.8.0_161), я не получаю тот же результат (документ результата не будет иметь отступов вообще). Что я могу сделать, чтобы изменить это?

(<xsl:output indent="yes"/> также сделает отступ для моих встроенных элементов, а это не то, что мне нужно, <xsl:strip-space elements/> удалит некоторые пробелы между встроенными элементами, которые необходимы).

Источник:

    <chapter id="ch3">
    <title>Sed quam, quaes apiducius nit peror asperch icatiat</title>
            <section id="s1">
            <title>Et faccae sitiaessum res re dolorer errovitam,</title>
            <paragraph id="p6">
                <text>lorerit ab is arum dolore quaepudit exped magnate mpelestinus volupta</text>
            </paragraph>
            <paragraph id="p7">
                <text>lorerit ab is arum <span class="s1">dolore</span> <span class="s2">quaepudit</span> exped magnate mpelestinus volupta</text>
            </paragraph>
            <paragraph id="p12">
                <text>lorerit ab is arum dolore quaepudit exped magnate mpelestinus volupta</text>
            </paragraph>
    </section>
</chapter>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"  xmlns:xlink="http://www.w3.org/1999/xlink">
    <xsl:template match="*">
        <xsl:element name="{local-name()}" >
            <xsl:for-each select="@*" >
                <xsl:attribute name="{local-name()}">
                    <xsl:value-of select="."/>
                </xsl:attribute>
            </xsl:for-each>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="paragraph">
        <xsl:element name="paragraph">
            <xsl:attribute name="id">p<xsl:number count="paragraph" from="chapter" level="any"></xsl:number>
            </xsl:attribute>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Код командной строки

java -cp path\saxon9he.jar net.sf.saxon.Transform -t -s:path\source.xml -xsl:path\transformation.xsl -o:path\result.xml

За исключением того факта, что исходный код находится в заданном c DTD. Когда я удаляю упоминание DTD в начале исходного кода, отступ остается прежним, в противном случае отступа нет. В чем причина этого и как я могу это изменить?

Спасибо! Мария (я довольно новичок)

1 Ответ

0 голосов
/ 27 марта 2020

Если:

(a) вы не удаляете пространство из входного документа

(b) ваша таблица стилей копирует все текстовые узлы, включая пробельные текстовые узлы, в дерево результатов

(c) вы не отступаете от сериализации

, тогда отступ результата должен совпадать с исходным.

Если этого не происходит, то мы нужно увидеть детали именно того, что вы делаете. Существует так много способов ошибочно определить пробелы, что невозможно понять, где вы ошиблись, не видя деталей.

(Кстати, вы можете использовать что-то вроде suppress-indentation="p" на xsl:output, чтобы получить отступ над уровень абзаца, но не в абзацах.)

...