XSLT пустое значение XML удаляет родительский конечный тег - PullRequest
0 голосов
/ 14 сентября 2018

У меня проблема с XSL-преобразованием. У меня есть код:

<span class="A"> <xsl:value-of select="FIELD_A" /> </span>
<span class="B"> <xsl:value-of select="FIELD_B" /> </span>

Вывод вышеуказанного кода при наличии значений верен:

<span class="A"> VALUE A </span>
<span class="B"> VALUE B </span>

Проблема в том, что некоторые значения отсутствуют. Если FIELD_A пусто, тогда выводится HTML:

<span class="A" />
<span class="B"> VALUE B </span>

и мой браузер создает:

<span class="A">
     <span class="B"> VALUE B </span>
</span>

Это заголовок моего файла xslt

<?xml version="1.0" encoding="ISO-8859-2" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">

Есть идеи, почему удален конечный тег этого диапазона и как я могу это исправить?

1 Ответ

0 голосов
/ 14 сентября 2018

Я полагаю, у вас нет правильного метода вывода XSLT для HTML как text/html, используйте <xsl:output method="html"/>, если вы хотите создать HTML, который будет анализироваться браузером как text/html. В противном случае процессор XSLT мог бы сериализовать пустые элементы span как <span/>, и тогда алгоритм синтаксического анализа HTML 5 действительно превращает последовательность <span class="A"/><span class="B">foo</span> в два вложенных элемента span, которые можно просмотреть в «живом просмотре DOM» для ваш пример .

Если у вас есть xsl:output method="html", но вы не получите правильный синтаксический анализ, то либо вы не позволяете процессору XSLT сериализовать результат преобразования XSLT, либо задействованы пространства имен.

На основе ваших правок ваш XSLT не производит HTML 4 или 5, а скорее XHTML (как указывает объявление пространства имен <html xmlns="http://www.w3.org/1999/xhtml">). Есть ли у вас необходимость сделать это? Для XSLT 1 для получения text/html гораздо проще избежать использования какого-либо пространства имен для элементов HTML. Если вы используете процессор XSLT 2 или 3 (например, Saxon 9 может использоваться под Java), тогда вы можете изменить метод вывода на <xsl:output method="xhtml"/>, если вам нужно пространство имен, но вы хотите, чтобы результат анализировался браузерами как text/html.

Если вам нужно пространство имен и вам нужно использовать XSLT 1, я бы предпочел использовать <xsl:output method="xml"/>, но затем убедиться, что браузер получает контент как application/xhtml+xml, а не как text/html. Но многие библиотеки сценариев, использующие старый document.write и другие вещи, не работают в XHTML, анализируемом как XML, поэтому у этого подхода есть свои недостатки, в зависимости от того, какие другие ресурсы, такие как код Javascript, использует ваш конечный документ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...