【问题标题】:Parsing XML string using XSLT使用 XSLT 解析 XML 字符串
【发布时间】:2010-12-20 17:44:44
【问题描述】:

我有一个包含 HTML 代码的 TextBlock 的 XML 文档。

<TextBlock>
  <h1>This is a header.</h1>
  <p>This is a paragraph.</p>
</TextBlock>

然而,在实际的 XML 中,它是这样编码的:

<TextBlock>
  &lt;h1&gt;This is a header.&lt;/h1&gt;
  &lt;p&gt;This is a paragraph.&lt;/p&gt;
</TextBlock>

所以当我使用&lt;xsl:value-of select="TextBlock"/&gt; 时,它会显示页面上的所有编码。有没有办法使用 XSLT 在 TextBlock 元素中将 &amp;lt; 转换为 &amp;lt;

【问题讨论】:

  • 为什么?这与将未解析的数据视为可解析的数据相同。不要,请!此外,这不是编码/解码问题,而是解析...
  • 当您问为什么时,我不确定您的意思是什么? XML 使用的是&amp;lt; 而不是&amp;lt;,所以我的数据显示不正确。为什么我要在页面上显示该代码?下面的解决方案解决了我的问题,除了不支持 DOE 的 Firefox,除非有更好的解决方案。
  • 您写道:XML 正在使用 [...]。那不是真的。文档作者正在使用它。
  • 当然。我想。我无法控制 XML 或 XML 的作者使用什么。我必须使用我所拥有的东西,所以无论哪种方式都无关紧要。我的问题仍然存在。

标签: xslt decoding


【解决方案1】:
<xsl:value-of select="TextBlock" disable-output-escaping="yes"/>

结果:

<h1>This is a header.</h1>
<p>This is a paragraph.</p>

Firefox有一个对应的bug:https://bugzilla.mozilla.org/show_bug.cgi?id=98168,里面包含很多cmets,读起来很有意思。

我现在正在寻找解决办法。

编辑

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="disable-output-escaping.xsl"/> 
    <!-- https://bug98168.bugzilla.mozilla.org/attachment.cgi?id=434081 -->
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/TextBlock">
        <xsl:copy>
            <xsl:call-template name="disable-output-escaping"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

通过 Firebug 检查时,结果看起来正确:

<textblock>
    <h1>This is a header.</h1>
    <p>This is a paragraph.</p>
</textblock>

【讨论】:

  • 老实说,我之前尝试过,但我一定是把它放在代码中的错误位置。谢谢!
  • 一个问题,它似乎在 Chrome、IE 和 Safari 中有效,但在 Firefox 中无效。当我在FF中查看时,它仍然在页面上显示所有编码&lt;h1&gt;This is a header.&lt;/h1&gt;&lt;p&gt;This is a paragraph.&lt;/p&gt;。任何线索为什么?
  • @jrottier:我认为,FF 的 XSLT 处理器不支持 DOE。 DOE 的问题在于它不是强制性的 XSLT 特性。在 XPath 3.0 中,可能有一个函数 parse() 正是考虑到这个用例。
  • @jrottier,@Dimitre,看我更新里的链接,真的很值得一读。
  • 呃。它甚至不适用于 CDATA 和实际的 "" 而不是 "lt","gt"。
猜你喜欢
  • 2013-01-29
  • 2017-08-28
  • 2019-07-17
  • 2010-12-23
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多