Почемуигнорировать пробелы? - PullRequest
1 голос
/ 18 ноября 2010

Почему <xsl:for-each select="text()"> игнорирует пробелы?

Пример XML-источника:

<body>
Things<note>such as people</note> <note>or animals</note>act in crazy ways.
</body>

Пример XSL:

<xsl:template match="body">
    <output>
        <xsl:for-each select="text()">
            <text>
                 <xsl:value-of select="."/>
            </text>
        </xsl:for-each>
    </output>
</xsl:template>

Я ожидал бы такой вывод:

<output>
    <text>Things</text><text> </text><text>act in crazy ways.</text>
</output>

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

<output>
    <text>Things</text><text>act in crazy ways.</text>
</output>

Может кто-нибудь дать мне некоторое представление о том, как это работает?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

Для каждого процессора XSLT (на самом деле от провайдера дерева XML) существуют различные варианты выбора только текстовых узлов из пустого пространства из источника ввода.инструкция xsl:preserve-space.

2 голосов
/ 18 ноября 2010

Дело не в том, что <xsl:for-each> игнорирует пустые текстовые узлы, скорее, текстовые узлы, содержащие только пробелы, могут быть удалены при разборе входного документа, прежде чем ваши шаблоны таблиц стилей когда-либо их увидят.

Согласно спецификации XSLT, XSLT по умолчанию удаляет из документа таблицы стилей только пробельные текстовые узлы, за исключением элементов <xsl:text>; но не удаляет их из исходного документа, если вы не используете <xsl:strip-space>.

Спецификация XSLT 1.0 описывает это так:

После дерева для исходного документа или документ таблицы стилей был построено, но до этого иначе обрабатывается XSLT, некоторый текст узлы зачищены. Текстовый узел никогда не удаляется, если только он не содержит пробельные символы. Зачистка текстовый узел удаляет текстовый узел из дерево. Процесс зачистки занимает в качестве ввода набора имен элементов для какие пробелы должны быть сохранены. Процесс зачистки применяется к как таблицы стилей, так и исходные документы, но набор пробелов, сохраняющих имена элементов определены по-разному для таблиц стилей и для Исходные документы.

Текстовый узел сохраняется, если какой-либо из применяется следующее:

  • Имя элемента родителя текстового узла находится в наборе имен элементов, сохраняющих пробелы.

  • Текстовый узел содержит как минимум один непробельный символ. Как и в XML, символ пробела является # x20, # x9, #xD или # xA.

  • Элемент-предок текстового узла имеет атрибут xml: space со значением preserve, а ближайший элемент-предок не имеет xml: space со значением по умолчанию.

В противном случае текстовый узел удаляется.

Атрибуты xml: space не являются раздели с дерева.

ПРИМЕЧАНИЕ. Это означает, что если атрибут xml: space указан в элемент буквального результата, это будет включены в результат.

Для таблиц стилей, набор Сохраняющие пробелы имена элементов состоит только из xsl: text.

Для исходных документов, набор Сохраняющие пробелы имена элементов определяется xsl: strip-space и xsl: preserve-space элементы верхнего уровня. Каждый из этих элементов имеет атрибут elements, значением которого является разделенный пробелами список NameTests. Изначально набор имен элементов, сохраняющих пробелы, содержит все имена элементов. [emphasis mine] Если имя элемента соответствует NameTest в элементе xsl: strip-space, то оно удаляется из набора пробелов Сохранение имен элементов. Если имя элемента соответствует NameTest в элементе xsl: preserve-space, то оно добавляется в набор имен элементов, сохраняющих пробелы.

Итак, в итоге, вычеркивание не должно происходить с вашим исходным документом ... если вы не используете элемент верхнего уровня <xsl:strip-space> в вашей таблице стилей. Если вы не используете <xsl:strip-space>, расскажите подробнее о вашем процессоре XSLT и элементах таблицы стилей верхнего уровня.

Согласно этой статье , не каждый XSLT-процессор соблюдает поведение по умолчанию, описанное в спецификации. Вы можете попробовать добавить следующее как потомок <xsl:stylesheet> и посмотреть, решит ли это проблему:

<xsl:preserve-space elements="*"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...