muhammad_97
@muhammad_97
PHP-разработчик

Как удалить пробелы в XML с помощью XSLT?

Есть такой XML:
<?xml version="1.0" encoding="UTF-8"?>
<content>
    <p>Lorem ipsum dolor sit amet,</p>

    <p>Quibusdam dolore iure deleniti quasi accusantium non nostrum facere neque ducimus
    mollitia et ex suscipit, placeat, eius maiores ratione cumque. <b>Provident</b> doloribus
    natus perspiciatis quas id sequi neque, molestiae cupiditate facere quod. Dolore voluptate
    consectetur:</p>

    <p>aperiam nihil.</p>

    <dialog>
        aperiam nihil.
        aperiam <b>123</b> nihil.
        aperiam nihil.
        <b>123</b>
    </dialog>

    <img src="images/my-image.jpg"/>
</content>


Нужно взять содержимое тега dialogue (текст в перемешку с тегами), удалить пробелы и обернуть все это дело в div. При этом нужно сохранить теги внутри. Написал такой код:

<xsl:template match="dialog">
    <p class="dialog">
        <xsl:copy-of select="node()"/>
    </p>
</xsl:template>


Теги сохраняются, но вместе с ними сохраняются и пробелы. Есть ли возможность в XSLT удалить пробелы в XML коде?

XSLT 1.0. Программно это делать как-то не хочется.
  • Вопрос задан
  • 1651 просмотр
Пригласить эксперта
Ответы на вопрос 2
zoonman
@zoonman
⋆⋆⋆⋆⋆
xsl:strip-space
Ответ написан
Комментировать
@theg4sh
Muhammad я же правильно понял - "удаление лишних пробелов"?

красиво и "мало кода" не получится - функция replace с поддержкой regexp доступна только для версии >=2.0.
Для версии 1.0 единственное подходящее под задачу решение будет:
<xsl:stylesheet version="1.1"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="p">
        <xsl:copy-of select="."/>
    </xsl:template>

    <xsl:template match="dialog">
        <p class="dialog">
            <xsl:for-each select="./*|./text()">
                <xsl:choose>
                    <xsl:when test="self::text()">
                        <xsl:value-of select="normalize-space(.)" />
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:text> </xsl:text>
                        <xsl:copy>
                            <xsl:copy-of select="./text()"/>
                        </xsl:copy>
                        <xsl:text> </xsl:text>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
        </p>
    </xsl:template>

</xsl:stylesheet>

Результатом будет:
<?xml version="1.0"?>

    <p>Lorem ipsum dolor sit amet,</p>

    <p>Quibusdam dolore iure deleniti quasi accusantium non nostrum facere neque ducimus
    mollitia et ex suscipit, placeat, eius maiores ratione cumque. <b>Provident</b> doloribus
    natus perspiciatis quas id sequi neque, molestiae cupiditate facere quod. Dolore voluptate
    consectetur:</p>

    <p>aperiam nihil.</p>

    <p class="dialog">aperiam nihil. aperiam <b>123</b> nihil. aperiam nihil. <b>123</b> </p>

Из минусов - будет ограничение на вложенное дерево элементов, хотя думаю можно допилить пример до использования шаблона в случае otherwise.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы