Использование сущности HTML в XSLT (например) - PullRequest
62 голосов
/ 28 августа 2008

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

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

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

Ответы [ 11 ]

116 голосов
/ 28 августа 2008

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

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

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

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

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

23 голосов
/ 30 сентября 2011

Также возможно расширить подход из 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 ... для загрузки патча и комментариев.

14 голосов
/ 28 августа 2008

есть еще одна возможность использовать html-сущности из xslt:

<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
6 голосов
/ 28 августа 2008

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

5 голосов
/ 28 августа 2008

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

5 голосов
/ 28 августа 2008

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

Да, и причина этого в том, что &nbsp; не является предопределенным объектом в XML или XSLT, как в HTML.

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

1 голос
/ 25 января 2012

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

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

0 голосов
/ 27 января 2013

Мне не повезло с подходом DOCTYPE от Aku.

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

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

Вроде гибрид из вышеперечисленного. Спасибо авторам Stackoverflow!

0 голосов

Необходимо использовать сущность # x160;

0 голосов
/ 18 января 2012

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

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

/ Стен Хугаард

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...