XSL / XML: как поместить HTML-теги в документ XML, чтобы они отображались - PullRequest
3 голосов
/ 05 мая 2011

Я пытаюсь заменить теги следующим образом:

<node><br></node> -- >  <node>&lt;br&gt;</node>

к сожалению, когда xsl анализирует XML-файл, я на самом деле получаю

<br>

, отображаемую на странице вместо того, чтобыотображается как разметка.

Ответы [ 4 ]

1 голос
/ 17 ноября 2013

Если вы хотите вставить не правильно сформированный HTML, это возможный обходной путь. Поместите свой не правильно сформированный html в комментарий внутри xml, затем извлеките его из xsl.

пример XML:

<Data>
  <!--
  <div>
    not well-formed xml<br>
  </div>
 -->
</Data>

пример XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:template match="Data">
    <html>
      <body>
        <xsl:value-of disable-output-escaping="yes" select="comment()"/>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="text() | @*">
  </xsl:template>
</xsl:stylesheet>

выход

<html>
  <body>
    <div>
     not well-formed xml<br>
    </div>
  </body>
</html>
1 голос
/ 05 мая 2011

HTML не является XML, хотя они выглядят очень похоже; В HTML допустимы четыре вещи, которые вы не можете сделать с XML, и все они могут быть изменены для соответствия XML:

  • Незакрытые теги, как вы обнаружили. Просто замените их закрытой версией - <br> на <br/> и т. Д.
  • Атрибуты без значений, например, в <input type="checkbox" checked>. Просто присвойте им значение с тем же именем, что и атрибут, т.е. <input type="checkbox" checked="checked" />.
  • Несоответствующие теги - это немного сложнее. Например, в HTML разрешено делать <b>A<i>B</b>C</i>, что делает A жирным шрифтом, C курсивом, а B жирным шрифтом и курсивом. Вы можете сделать этот XML-совместимый, выполнив <b>A<i>B</i></b><i>C</i> или <b>A</b><i><b>B</b>C</i>.
  • Большинство лиц. Только &lt;, &gt;, &amp;, &quot;, &apos; и значения Unicode (например, &#160; / &#xA0;) являются допустимыми объектами в XML. Вы не можете использовать &nbsp; или &oslash; или что-то подобное по умолчанию. Чтобы это исправить, вам нужно добавить объявление сущности вверху листа, например <!ENTITY nbsp "&#160;">.

XSLT не способен обрабатывать файл HTML, если он не является действительным XML.

Как правило, я всегда пишу HTML для совместимости с XML просто потому, что он делает доступным весь спектр инструментов XML, и на самом деле нет причин не делать этого.

Замена <br> на &lt;br&gt; фактически заменяет тег на TEXT, который похож на html, а не на xml-совместимый тег.

0 голосов
/ 05 мая 2011

Текст, который вы предоставили:

<node><br></node>

не является правильно сформированным документом XML и не подходит для обработки в XSLT 1.0.

Если у вас есть:

<node><br/></node>

затем просто выведите элемент <br/> "как есть" - тогда это допустимая разметка.

Пример

Это преобразование :

<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="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="nodes">
  <html>
   <xsl:apply-templates/>
  </html>
 </xsl:template>

 <xsl:template match="node">
  <p>
   <xsl:apply-templates/>
  </p>
 </xsl:template>
</xsl:stylesheet>

при применении к этому документу XML :

<nodes>
 <node>
 1 <br/>
 2 <br/>
 3 <br/>
 </node>
</nodes>

производит

<html>
   <p>
      1 <br>
      2 <br>
      3 <br></p>
</html>

и это отображается браузером как :

1
2
3

0 голосов
/ 05 мая 2011

Оставьте их как <br/> и запишите соответствующее преобразование XSLT, чтобы сопоставить их с выходными данными как есть.

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