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


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

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

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

11 59

11 ответов:

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

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

или вы можете описать &nbsp в локальном 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 упоминает.

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

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

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

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

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

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

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

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

/ Sten Hougaard

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

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

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

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

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

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