Пробелы в xsl: текстовые элементы - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть следующая таблица стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" encoding="UTF-8"/>
  <xsl:template match="/">
    <xsl:text>1</xsl:text>
    <xsl:text>
    </xsl:text>
    <xsl:text>2</xsl:text>
</xsl:template>
</xsl:stylesheet>

При запуске с Saxon 9.8 я получаю следующий результат:

1
        2

При запуске с MSXML 6.0 пробел удаляется иЯ получаю:

1 2

Что такое правильное поведение?Здесь пробелы должны быть удалены?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Правильное поведение, как вы видите это из Саксонии.

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

Я почти уверен, что естьв MSXML есть параметры для управления этим поведением, поэтому проверьте, как именно вы вызываете синтаксический анализатор MSXML, и при необходимости измените параметры.

0 голосов
/ 07 февраля 2019

Это связано с разделением пробелов в документе XSLT.В соответствии со спецификацией W3C (для XSLT 1.0, который используется в MSXML)

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

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

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

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

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

Итак, похоже, что MSXML не соответствует спецификации.

Однако, если вы добавите xml:space="preserve" к рассматриваемому xsl:text, вы можете обнаружить, что он работает в MSXML

<xsl:template match="/">
  <xsl:text>1</xsl:text>
  <xsl:text xml:space="preserve">
  </xsl:text>
  <xsl:text>2</xsl:text>
</xsl:template>
...