XSL / XML:请将html标记放在xml doc中,以便进行渲染

时间:2011-05-04 23:23:04

标签: html xml xslt

我尝试更换这样的标签:

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

不幸的是,当xsl解析我实际得到的xml文件时     

<br>

显示在页面上,而不是显示为标记。

4 个答案:

答案 0 :(得分:1)

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粗体,斜体和B都粗体和斜体。您可以通过执行<b>A<i>B</i></b><i>C</i><b>A</b><i><b>B</b>C</i>
  • 来使此XML符合规定
  • 大多数实体。只有&lt;&gt;&amp;&quot;&apos;和unicode值(例如&#160; / &#xA0;)才是有效实体在XML中。默认情况下,您无法使用&nbsp;&oslash;或类似内容。要解决此问题,您需要在工作表顶部包含实体声明,例如<!ENTITY nbsp "&#160;">

XSLT无法处理HTML文件,除非它也是有效的XML。

作为一项规则,我总是将HTML写成符合XML标准,因为它使得所有XML工具都可用,并且没有理由不这样做。

<br>替换&lt;br&gt;实际上将标签替换为类似于html的TEXT,而不是符合xml的标签。

答案 1 :(得分:1)

如果你想插入一个格式不正确的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>

答案 2 :(得分:0)

将它们保留为<br/>并编写适当的XSLT转换,将它们按原样映射到输出。

答案 3 :(得分:0)

您提供的文字:

<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