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

StackOverflow https://stackoverflow.com/questions/31870

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

или просто используйте &#160; вместо того, чтобы &nbsp;

Другие советы

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

<!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... для загрузки патча и комментариев.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top