【问题标题】:XSL/XML: HOw to put html tags in an xml doc so they renderXSL/XML:如何将 html 标记放在 xml 文档中以便它们呈现
【发布时间】:2011-05-04 23:23:04
【问题描述】:

我尝试像这样替换标签:

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

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

<br>

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

【问题讨论】:

  • 好问题,+1。请参阅我的答案以获得完整的解决方案。

标签: html xml xslt


【解决方案1】:

HTML 不是 XML,尽管它们看起来非常相似;在 HTML 中有四件事是有效的,而您不能用 XML 做这些事情,所有这些都可以修改为与 XML 兼容:

  • 如您所见,未封闭的标签。只需将这些替换为封闭版本 - &amp;lt;br&amp;gt;&lt;br/&gt; 等。
  • 没有值的属性,例如&lt;input type="checkbox" checked&gt;。只需为它们分配一个与属性同名的值,即&lt;input type="checkbox" checked="checked" /&gt;
  • 标签不匹配 - 这些有点棘手。例如,在 HTML 中执行 &lt;b&gt;A&lt;i&gt;B&lt;/b&gt;C&lt;/i&gt; 是合法的,这将使 A 变为粗体、C 为斜体,B 为粗体和斜体。您可以通过 &lt;b&gt;A&lt;i&gt;B&lt;/i&gt;&lt;/b&gt;&lt;i&gt;C&lt;/i&gt;&lt;b&gt;A&lt;/b&gt;&lt;i&gt;&lt;b&gt;B&lt;/b&gt;C&lt;/i&gt; 使此 XML 兼容。
  • 大多数实体。只有 &amp;lt;&amp;gt;&amp;amp;&amp;quot;&amp;apos; 和 unicode 值(例如 &amp;#160;/&amp;#xA0;)是 XML 中的有效实体。默认情况下,您不能使用&amp;nbsp;&amp;oslash; 或类似的东西。要解决此问题,您需要在工作表顶部包含实体声明,例如 &lt;!ENTITY nbsp "&amp;#160;"&gt;

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

通常,我总是将 HTML 编写为与 XML 兼容,仅仅是因为它使所有 XML 工具都可用,而且真的没有理由不这样做。

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

【讨论】:

  • method="html" 的输出“始终符合 XML”的说法是不正确的。话虽如此,否则您的答案非常好。
  • 嘿,好点子。我不得不承认,我总是只使用 XML 作为输出方法,因为我想要符合 XML 的 HTML;以前使用 html 时从未注意到它不会关闭标签。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    将它们保留为 &lt;br/&gt; 并编写适当的 XSLT 转换以将它们按原样映射到输出。

    【讨论】:

      【解决方案4】:

      您提供的文字:

      <node><br></node>
      

      不是格式良好的 XML 文档,不适合使用 XSLT 1.0 进行处理。

      如果你有:

      <node><br/></node>
      

      然后简单地输出 &lt;br/&gt; 元素“原样”——那么它就是一个有效的标记。

      示例

      这种转变

      <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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-22
        • 2018-11-07
        • 2013-12-19
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        相关资源
        最近更新 更多