在XML+XSL(双重解析)中评估< >的含义。

3

我刚刚使用一个导出应用将我的整个LiveJournal博客导出到了一个XML文件中。这样做的原因是为了归档并保存给未来的后代。我想为它制作一个简单的布局文件,这样我就可以阅读帖子并感受怀旧之情。它看起来像任何普通的XML文件:

<livejournal>
  <entry>
    <itemid>1</itemid>
    <eventtime>Date/time</eventtime>
    <subject>Subject Line</subject>
    <event>The actual post</event>
    <allowmask>0</allowmask>
    <current_mood>current mood</current_mood>
    <current_music>current mood</current_music>
    <taglist>comma, separated, tags</taglist>
    <comment>
      <itemid>2433</itemid>
      <eventtime>Date</eventtime>
      <subject>Subject Line</subject>
      <event>The actual comment</event>
      <author>
        <name>Commenter</name>
        <email>Commenter@email</email>
      </author>
    </comment>
  </entry>
  <entry>
</livejournal>

到目前为止一切都很好。问题出现在我尝试为它制作xsl文件时。xml文件中的<event>标签不仅包含文本,还包含HTML。而且这些HTML是2004年编写的,并由各种meme生成器生成。因此代码的价值不高。我们看到了可爱的标签和大量未关闭的img、input、br和hr标签。
当前版本的导出已经用&lt;&gt;替换了所有的<>,因此它将被视为一个xml文件。我想做的是能够查看带有所有预期HTML标签的XML文件。因此<b></b>会使事情变得粗体。但是,由于&lt;b&gt;&lt;/b&gt;不能正确评估,我不知道该怎么做。
<event>I ate a &lt;b&gt;tasty&lt;/b&gt; cucumber</event>

输出

我吃了一根美味的黄瓜

而不是

我吃了一根美味的黄瓜

有没有办法解决这个问题?将xml文件中的所有lt、gt更改为<>会使其无法评估,因为HTML存在错误。我也不想手动处理700多个帖子以使它们正确地评估。

1个回答

1
一个 <xsl:value-of select="entry" disable-output-escaping="yes"/> 就能解决问题。
示例 XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:template match="/">
        <html>
            <head></head>
            <body>                
                <xsl:apply-templates select="*"/> 
            </body>
        </html>
    </xsl:template>

    <xsl:template match="*">
        <xsl:apply-templates select="*"/>
    </xsl:template>

    <xsl:template match="event">
        <div class="event">
            <xsl:value-of select="." disable-output-escaping="yes"/>                        
        </div>
    </xsl:template>

</xsl:stylesheet>

运行于:

<livejournal>
    <entry>
        <itemid>1</itemid>
        <eventtime>Date/time</eventtime>
        <subject>Subject Line</subject>
        <event>I ate a &lt;b&gt;tasty&lt;/b&gt; cucumber</event>
        <allowmask>0</allowmask>
        <current_mood>current mood</current_mood>
        <current_music>current mood</current_music>
        <taglist>comma, separated, tags</taglist>
        <comment>
            <itemid>2433</itemid>
            <eventtime>Date</eventtime>
            <subject>Subject Line</subject>
            <event>The actual comment</event>
            <author>
                <name>Commenter</name>
                <email>Commenter@email</email>
            </author>
        </comment>
    </entry>
</livejournal>

结果为:

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   </head>
   <body>
      <div class="event">I ate a <b>tasty</b> cucumber</div>
      <div class="event">The actual comment</div>
   </body>
</html>

它在Chrome和FireFox中不起作用,但在Internet Explorer中可以!如果我有一种查看它的方式,那就让我很高兴了,所以对我来说它是有效的。非常感谢您的帮助! - Mattias Storm
我搭建了一个快速的Web服务器(node.js)来提供这里的XML页面,当完成后在Chrome上运行良好,但在Firefox上却无法正常工作。在Firefox中,检查器显示已经成功解析,只是不知道如何呈现(可能是Firefox中的XSL渲染器存在问题)。 - Paul Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接