Як вставити & nbsp; в XSLT


207

Як я можу вставити

 

У таблиці стилів XSLT я продовжую отримувати цю помилку:

Помилка розбору XML: невизначена сутність

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


2
Ви також можете використовувати & # xA0; те саме до & # 160; дивіться тут stackoverflow.com/questions/7511214 / ...
user3766111

Відповіді:


337

Використовуйте  замість коду сутності .

 є HTML "посиланням на сутність символу". У XML не існує іменованої сутності для нерозривного простору, тому ви використовуєте код  .

У Вікіпедії є список сутностей XML та HTML , і ви можете бачити, що у XML є лише 5 "заздалегідь визначених об'єктів", але HTML має понад 200. Я також вкажу на створення простору (& nbsp;) у XSL, який має відмінні відповіді.


3
Нещодавно ми потрапили в ситуацію, коли лише один із багатьох XSL перестав працювати з цією технікою і почав демонструвати дивного характеру. Однак якщо я використовую CDATA-техніку WaterSoul, вона працює.

@BrianReindel, це, ймовірно, означає, що ви використовували неправильну числову посилання сутності, тобто Šзамість  останньої, яка завжди буде вирішувати Unicode, що не порушує простір.
Авель

Посилання Top Ten Java та XSLT Поради справді корисні.
LCJ

<xsl: text> & # 160; </ xsl: text> вона
розділяє

1
Посилання гнило.
GSerg

37

&#160;працює дуже добре. Однак він відобразить одного з цих дивних символів в кодуванні ANSI. <xsl:text>найкраще працював для мене.

<xsl:text> </xsl:text>

3
Використовуючи прийняту відповідь, я закінчив пробіл рядків у моєму виведенні XML (принаймні, так це виглядало у редакторі XML VS2010). Використовуючи цю відповідь, я отримую рівно 1 пробіл.
Mathijs Flietstra

1
@Matthijs, це простір, а не нерозривний простір, який не є тим самим. Якщо VS показує це неправильно, перевірте кодування (VS цілком здатний це правильно відобразити, і воно повинно бути кодування незалежним, тому більше шансів, що ви робили щось інше не так).
Авель

25

Можна також зробити це:

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

2
Це спрацює, якщо процесор підтримуєdisable-output-escaping , чого йому не потрібно, і він був застарілим у XSLT 2.0 і більше в 3.0. У цих версіях ви можете досягти такого ж ефекту при xsl:character-mapгарантованій роботі крос-процесора. Крім того, це розміщує названий об'єкт &nbsp;у висновку, який не обов'язково є таким самим, як пробіл , який не порушується, і приймальний кінець повинен оголошувати цю сутність (у HTML це зазвичай неявно).
Авель

21

Використовуй це

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

Редагувати: Насамперед слід, мабуть, підтвердити, що це працює спочатку (це і є найбільш загальним рішенням проблеми.)


1
Не впевнений, але я перевірив свій підхід, і він працює, тож я не впевнений, для чого був знижений :(
jagprinderdeep

2
Також прийнята відповідь не буде дійсною для всіх парсерів відповідно до пов’язаної сторінки; просто голова вгору
jagprinderdeep

1
Я раніше давав причину свого голосування, але якби я був спростую цю відповідь, то причина була б - вона відповідає на неправильне запитання. ОП чітко запитала, як розмістити в нерозривному просторі, використовуючи xslt, і ви відповіли, як поставити послідовність ampersand-nbsp-крапка з комою. І сварки з низовин також є одиницею. Але серйозно, ви ніколи цього не говорили про CDATA?
Майкл Крелін - хакер

1
Гаразд, jagprinderdeep, я відкликаю свій голос, але взамін, будь ласка, піди до мене, як тільки я потрапляю у притулок. (зауважте, що я не повертаю вам відгук з цієї нової причини). Але розумійте, що ви відповідаєте на неправильне запитання. Я думаю, що це була саме причина, що стояла за іншим судом.
Майкл Крелін - хакер

8
Я також заявив, що ви не можете гарантувати, що кінець прийому оголосить & nbsp ;. Якщо ви працюєте з xslt + html, то так, це спосіб зробити це, хоч хак. Але якщо ви використовуєте xslt для створення іншого XML, то він просто підірветься на вас.
Дуг

14

Ви можете додати визначення цього об’єкту на початку файлу (нижче декларації xml):

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

Також ви можете додати більше об'єктів, таких як Ntilde, Aacute тощо.


5

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

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


1
Зауважте, що останнім часом W3 почав блокувати занадто багато запитів на ті та подібні посилання, якщо вони надходять з автоматизованого процесу. Розмістіть цей файл локально або на своєму сервері та відрегулюйте URL-адресу відповідно, і вам буде добре. Крім цього, +1 та відмінне рішення для використання сутностей, що мають ім'я HTML.
Авель

Хороша примітка, а також є ще одна причина наявності локальної копії файлу з визначеннями сутності, оскільки в іншому випадку процес XSLT, ймовірно, не вдасться, якщо підключення до Інтернету недоступне. У світі Java немає необхідності зламати URL-адреси, оскільки можна домовитись про EntityResolver , і Apache XML Commons Resolver може бути хорошим кандидатом. На інших платформах програмування, ймовірно, будуть також подібні методи ...
Сергій Ушаков,


2

Якщо ви користуєтесь наступним (без disable-output-escaping!), Ви отримаєте єдиний нерозривний простір:

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


4
Вам не потрібно disable-output-escapingдля цього
Ian Roberts

2

Таблиці стилів XSLT повинні бути добре сформованими XML. Оскільки "&nbsp;"не є одним із п’яти заздалегідь визначених об'єктів XML , його не можна безпосередньо включити до таблиці стилів. Тому повернення до вашого рішення "&#160;"- це ідеальна заміна, "&nbsp;"яку ви повинні використовувати.

Приклад:

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

0

Ви також можете використовувати:

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

запам'ятайте підсилювач після & або ви отримаєте повідомлення про помилку


Це виведе &amp;nbsp;(припускаючи, що ви мали на меті крапку з комою), яка буде відображатися як &nbsp;, а не як `` (nb-пробіл).
Авель

0

Я намагався відобразити межі порожньої комірки в таблиці HTML. Моя стара хитрість використання нерозривного простору в порожніх клітинках не працювала з xslt. Я використовував перерву лінії з тим же ефектом. Я згадую про це лише на випадок, коли ви намагалися використати нерозривний простір, щоб дати деякий вміст "порожній" комірці таблиці, щоб увімкнути межі комірок.

<br/>

У мене є аналогічний сценарій, і це, здається, працює в отриманні осередків таблиці для відображення.
Річард Мур

0

Спробуйте використовувати

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

Але це залежить від використовуваного процесора XSLT: специфікація XSLT не вимагає процесорів XSLT для їх перетворення в " &nbsp;".


0

Хоча відповідь вже надали @brabster та інші.
Я думаю, що більш багаторазовим рішенням було б:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.