Я полагаю, у вас нет правильного метода вывода 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, использует ваш конечный документ.