Як вставити & 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.