Использование объекта HTML в XSLT (например,  )

Каков наилучший способ включения html-объекта в XSLT?

<xsl:template match="/a/node">
    <xsl:value-of select="."/>
    <xsl:text>&nbsp;</xsl:text>
</xsl:template>

этот возвращает XsltParseError

Ответ 1

Вы можете использовать раздел CDATA

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>

или вы можете описать & nbsp в локальном DTD:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

или просто используйте &#160; вместо &nbsp;

Ответ 2

Также можно расширить подход из 2-й части ответа aku и получить все известные ссылки на символы, например:

<!DOCTYPE stylesheet [
  <!ENTITY % w3centities-f PUBLIC "-//W3C//ENTITIES Combined Set//EN//XML"
      "http://www.w3.org/2003/entities/2007/w3centities-f.ent">
  %w3centities-f;
]>
...
<xsl:text>&nbsp;&minus;30&deg;</xsl:text>

В результате есть определенная разница по сравнению с подходом <xsl:text disable-output-escaping="yes">. Последний будет создавать строковые литералы, такие как &nbsp; для всех видов вывода, даже для <xsl:output method="text">, и это может отличаться от того, что вы можете пожелать... Напротив, получение сущностей, определенных для шаблона XSLT через <!DOCTYPE ... <!ENTITY ... всегда будет выводить результат, соответствующий вашим настройкам xsl:output.

Тогда может быть разумным использовать локальный распознаватель сущности, чтобы механизм XSLT не выводил определения сущности символов из Интернета. JAXP или явным пользователям Xalan-J может потребоваться исправление для Xalan-J, чтобы правильно использовать преобразователь. Смотрите мой блог XSLT, сущности, Java, Xalan... для загрузки папок и комментариев.

Ответ 3

еще одна возможность использовать html-объекты из xslt является следующей:

<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>

Ответ 4

XSLT обрабатывает только пять основных объектов по умолчанию: lt, gt, apos, quot и amp. Все остальные должны быть определены как @Aku.

Ответ 5

этот возвращает XsltParseError

Да, и причина в том, что &nbsp; не является предопределенным сущностью в XML или XSLT, как в HTML.

Вы можете просто использовать символ Юникода, который &nbsp; означает: &#160;

Ответ 6

Теперь, когда Unicode, он обычно контрпродуктивен для использования именованных символов. Я бы рекомендовал использовать символ Unicode для неразрывного пространства вместо сущности только по этой причине. В качестве альтернативы вы можете использовать объект &#160;, вместо имени объекта. Использование именованных объектов делает ваш XML зависимым от встроенного или внешнего DTD.

Ответ 7

Благодарим вас за информацию. Я написал короткое сообщение в блоге, основанное на том, что сработало для меня, поскольку я делал трансформацию XSLT в шаблоне Dynamicweb CMS.

Сообщение в блоге находится здесь: Как добавить объекты в шаблоны XSLT.

/Стен Хогард

Ответ 8

Я обнаружил, что все эти решения выдают символ Â в пустое пространство.

Используя <xsl:text> </xsl:text>, я решил проблему для меня; но <xsl:text>#x20;</xsl:text> может работать.

Ответ 9

Необходимо использовать объект # x160;

Ответ 10

Мне не повезло с подходом DOCTYPE от Аку.

Что работало для меня в MSXML-преобразованиях на сервере Windows 2003, было

    <xsl:text disable-output-escaping="yes">&amp;#160;</xsl:text>

Тип гибрида выше. Спасибо, вкладчики Stackoverflow!

Ответ 11

      

Один пробел между текстовыми тегами должен быть достаточно.