2009-09-22 2 views
176

Как я могу вставитьКак вставить   в XSLT

 

в таблицу стилей XSLT, я получаю эту ошибку:

XML Parsing Error: undefined entity

По существу я хочу неразрывный пробел символ в XSLT шаблона ,

+2

Вы также можете использовать   же для   посмотреть здесь http://stackoverflow.com/questions/7511214/what-is-the-difference-between-x00a0-and- 160 – user3766111

ответ

293

Попробуйте использовать объект  .

Подробнее о том, почему   не работает и другие возможности here.

+6

Отличный, именно то, что мне нужно .... –

+2

+1 и всегда есть возможность объявить объект nbsp. –

+3

Недавно мы столкнулись с ситуацией, когда только один из многих XSL прекратил работать с этой техникой и начал показывать странный персонаж. Однако, если я использую метод CDATA WaterSoul, он работает. – 2012-02-10 22:36:06

21

Используйте этот

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

редактировать: Downvoters, вероятно, следует проверить, что это работает первый (. Он делает, и является наиболее общим решением проблемы)

+1

nbsp не является явно закодированным пространством. –

+2

никогда не говорил, что это – jagprinderdeep

+0

Я беспокоюсь о своем психическом состоянии. Я уверен, что я прокомментировал ответ, сказав что-то вроде «почему бы не использовать CDATA вместо явного кодирования пространства». Я не вижу в этом никаких следов, но у меня все еще есть уверенность. Скажи мне, ты совсем сошел с ума? –

11

Вы можете добавить определение для это лицо в начале файла (ниже декларации XML):

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

Также вы можете добавить объекты, такие как Ntilde, Aacute и т.д.

25

Можно также сделать это:

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

Это будет работать *, если процессор поддерживает 'disable-output-escaping' *, который ему не требуется, и он устарел в XSLT 2.0 и более, поэтому в версии 3.0. В этих версиях вы можете добиться того же эффекта, что и 'xsl: character-map', гарантированный работой кросс-процессора. Кроме того, это помещает именованный объект ' ' в вывод, который * не обязательно совпадает с неразрывным пробелом *, а принимающая сторона * должна содержать этот объект * (в HTML он обычно неявно). – Abel

-1

Я пытался показать границы на пустой ячейке в HTML-таблице. Мой старый трюк использования неразрывного пространства в пустых ячейках не работал с xslt. Я использовал разрывы строк с тем же эффектом. Я упоминаю об этом на всякий случай, когда причина, по которой вы пытались использовать неразрывное пространство, заключалась в том, чтобы предоставить некоторый контент в «пустую» ячейку таблицы, чтобы включить границы ячеек.

<br/> 
5

В дополнение к victor hugo's answer можно получить все известные символьные ссылки юридические в файле XSLT, как это:

<!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>&amp; &nbsp; &ndash;</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, entities, Java, Xalan... для загрузки папок и комментариев.

+1

Обратите внимание, что в последнее время W3 начал блокировать слишком много запросов на эти и подобные ссылки, если они поступают из автоматизированного процесса. Поместите этот файл локально или на свой сервер и соответствующим образом настройте URL-адрес, и все будет в порядке. Кроме этого, +1, и отличное решение для использования имен HTML с именами. – Abel

+0

Хорошее замечание, и есть еще одна причина, чтобы иметь локальную копию файла с определениями сущностей, поскольку иначе процесс XSLT, скорее всего, потерпит неудачу, если интернет-соединение недоступно. В мире Java нет необходимости взламывать URL-адреса, так как можно организовать [EntityResolver] (http://docs.oracle.com/javase/8/docs/api/org/xml/sax/EntityResolver. html) и [Apache XML Commons Resolver] (http://xerces.apache.org/xml-commons/components/resolver/) могут быть хорошим кандидатом. Другие платформы программирования, вероятно, тоже будут иметь аналогичные методы ... –

+0

Да, так для справки, для dotnetters: [Метод абстрактного разрешения ResolveEntity] (https://msdn.microsoft.com/en-us/library/system.xml. xmlreader.resolveentity% 28v = vs.110% 29.aspx) для объектов и [XmlResolver для загрузки внешних ресурсов] (https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.xmlresolver%28v = vs.110% 29.aspx), которые являются [эквивалентами .NET для этих методов Java] (http://stackoverflow.com/questions/942882/does-the-java-uriresolver-concept-exist-in-c -sharp-и-нет). – Abel

2

При использовании следующих вы получите единый неразрывный пробел (без disable-output-escaping!):

<xsl:text>&#160;</xsl:text>

+4

Вам не нужно 'disable-output-escaping' для этого –

25

&#160; работает очень хорошо. Тем не менее, он отображает один из этих странных символов в кодировке ANSI. <xsl:text> работал лучше для меня.

<xsl:text> </xsl:text> 
+3

Используя принятый ответ, я закончил разрыв строки в моем XML-выходе (по крайней мере, это было похоже на XML-редактор VS2010). Используя этот ответ, я получаю ровно 1 пробел. –

+1

@Matthijs, это пространство, а не неразрывное пространство, которое не то же самое. Если VS показывает это неправильно, проверьте свою кодировку (VS вполне способен показать это правильно и должен быть независимым от кодирования, поэтому, скорее всего, вы делали что-то еще не так). – Abel

0

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

<xsl:value-of select="'&amp;nbsp'"/> 

запомнить усилитель после & или вы получите сообщение об ошибке

+0

Это приведет к выводу ' nbsp;' (предполагается, что вы намереваетесь использовать точку с запятой), которая будет отображаться как ' ', а не как '' (nb-space). – Abel

1

XSLT таблицы стилей должны быть хорошо сформированные XML. Поскольку "&nbsp;" не является одним из the five predefined XML entities, его нельзя напрямую включить в таблицу стилей. Итак, вернемся к вашему решению "&#160;" - идеальная замена "&nbsp;", которую вы должны использовать.

Пример:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/> 
Смежные вопросы