online - Как вставить & nbsp;в XSLT




java example (10)

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

 

В таблицу стилей XSLT я продолжаю получать эту ошибку:

Ошибка анализа XML: неопределенный объект

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


Answers

Используйте код сущности   вместо.

  является ссылкой на символ символа HTML. В XML не существует именованного объекта для неразрывного пространства, поэтому вы используете код   ,

Википедия включает в себя список сущностей XML и HTML , и вы можете видеть, что в XML есть только 5 «предопределенных сущностей», но HTML имеет более 200. Я также укажу на « Создание пространства» (& nbsp;) в XSL, который имеет отличные ответы.


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

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


Использовать этот

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

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


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

<br/>

Возможно, вы захотите добавить определение для этого объекта в начале файла (ниже объявления xml):

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

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


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

Пример:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/>

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

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

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

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

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


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

<xsl:text> </xsl:text>

почему предыдущий код выводит TEXT, почему я должен настаивать на том, чтобы XSL игнорировал все остальные тексты? заключается в том, что поведение всех парсеров XML или только моих собственных

Вы обнаруживаете одну из самых фундаментальных функций XSLT, как указано в Спецификации: встроенные шаблоны XSLT .

Из спецификации :

Существует встроенное правило шаблона, позволяющее продолжить рекурсивную обработку в отсутствие успешного совпадения шаблонов с помощью явного правила шаблона в таблице стилей. Это правило шаблона применяется как к узлам, так и к корневому узлу. Ниже показано эквивалентное встроенное правило шаблона:

<xsl:template match="*|/">
  <xsl:apply-templates/>
</xsl:template>

Существует также встроенное правило шаблона для каждого режима, что позволяет продолжить рекурсивную обработку в том же режиме в отсутствие успешного совпадения шаблонов с помощью явного правила шаблона в таблице стилей. Это правило шаблона применяется как к узлам, так и к корневому узлу. Ниже приведен эквивалент встроенного правила шаблона для режима m.

<xsl:template match="*|/" mode="m">
  <xsl:apply-templates mode="m"/>
</xsl:template>

Существует также встроенное правило шаблона для узлов текста и атрибута, которые копируют текст через:

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

Встроенное правило шаблона для обработки инструкций и комментариев - ничего не делать.

<xsl:template match="processing-instruction()|comment()"/>

Встроенное правило шаблона для узлов пространства имен также ничего не значит. Нет шаблона, который может соответствовать узлу пространства имен; поэтому встроенное правило шаблона является единственным правилом шаблона, которое применяется для узлов пространства имен.

Встроенные правила шаблонов обрабатываются так, как если бы они были импортированы неявно перед таблицей стилей и поэтому имеют более низкий приоритет импорта, чем все другие правила шаблонов. Таким образом, автор может переопределить встроенное правило шаблона, включив явное правило шаблона.

Таким образом, сообщаемое поведение является результатом применения встроенных шаблонов - 1-го и 2-го из всех трех из них.

Это хороший шаблон дизайна XSLT для переопределения встроенных шаблонов с вашим собственным, который будет вызывать сообщение об ошибке, когда будет вызвано так, что программист сразу узнает, что его трансформация «протекает»:

Например , если есть этот XML-документ:

<a>
  <b>
    <c>Don't want to see this</c>
  </b>
</a>

и он обрабатывается с помощью этого преобразования :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="a|b">
   <xsl:copy>
      <xsl:attribute name="name">
        <xsl:value-of select="name()"/>
      </xsl:attribute>
      <xsl:apply-templates/>
   </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

результат :

<a name="a">
   <b name="b">Don't want to see this</b>
</a>

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

Тем не менее, просто добавление этого catch-all template позволяет избежать таких путаниц и ошибок при сбое :

 <xsl:template match="*">
  <xsl:message terminate="no">
   WARNING: Unmatched element: <xsl:value-of select="name()"/>
  </xsl:message>

  <xsl:apply-templates/>
 </xsl:template>

Теперь, помимо запутанного вывода, программист получает предупреждение, которое немедленно объясняет проблему :

 WARNING: Unmatched element: c




xslt