XSLT:如何解析嵌入在XML中的HTML?

6
在我的网站上,我有一些包含页面内容的XML文件(从我的数据库自动生成)- 这些内容使用XSLT进行显示。问题在于:我想在某些XML标记中添加一些格式。例如,如果我有一个包含文章的XML,格式如下:
<article>
  <header>Cool article</header>
  <author>Me!</author>
  <content>
    This is an article. It's <b>HUGE</b>, and here's a <a href="http://Www.foo.com">link</a>.
  </content>
</article>

然而,如果我仅使用以下内容获取内容:<xsl:value-of select="content" /> 所有的HTML格式都会被忽略/丢失。我猜测它被误认为是XML子节点,而不是实际驻留在内容节点中的数据。
如何实现像这里描述的格式?
提前感谢。

3
这是实际的答案。使用copy-of而不是value-of来处理嵌入式XML标记。 - Josiah Ruddell
6个回答

7
<xsl:value-of select="content" /> 

输出节点的值。您的<content>节点的值实际上是:

这是一篇文章。它很大,这里有一个链接

您可能需要复制整个节点:

<xsl:copy-of select="content" /> 

这主要是猜测,因为我不知道你的系统如何工作。

1
谢谢,这部分是问题的原因。 :) 使用 copy-of 而不是 value-of 与 <xsl:output method="html" ... /> 结合使用可以解决它。 - Hallgeir
1
这对我来说看起来也是正确的,但它取决于在XML中嵌入XHTML,而不仅仅是HTML。其次,copy-of将输出原始源XML文档的命名空间中的内容,而不是XSL要输出到的命名空间。大多数Web浏览器可能并不真正关心,但如果您在输出中看到一堆xmlns="..."属性,这就是原因。 - Chris Nielsen
1
旧帖子,现在对我有所帮助。 - Mathijs Segers

3
<xsl:value-of
select="..."
disable-output-escaping="yes"/>

这适用于除了Firefox浏览器以外的所有浏览器。


XSLT是在服务器端解析的,所以除非我漏掉了什么,否则浏览器应该无关紧要?(顺便说一下,这是我的特定问题的解决方案,谢谢!) - Nathan Hornby
@NathanHornby 浏览器也可以解析XML/XSLT。 - ZippyV

2
我认为你的问题在于这个方面:
 <xsl:output method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
          media-type="application/html+xml" encoding="utf-8" omit-xml-declaration="yes" indent="no"/>

请确保您的输出类型为HTML格式。

application/html

干杯!将 method="html" 设置好了,它完美解决了问题。 :) - Hallgeir

0

在将HTML放入XML文档中时,请确保在将其放入XML之前对任何HTML代码进行编码。例如:

This is an article. It's <b>HUGE</b>, and here's a <a href="http://Www.foo.com">link</a>.  

会变成:

This is an article. It's &lt;b&gt;HUGE&lt;/b&gt;, and here's a &lt;a href="http://www.foo.com"&gt;link&lt;/a&gt;

或者使用CDATA块,以便HTML格式不会丢失。


很遗憾,这会使标签以纯文本形式显示,即没有应用格式。我使用<xsl:output method="html" ... />来修复它。无论如何,谢谢。 - Hallgeir

0

当您将HTML嵌入元素中时,可以对其进行编码,或使用CDATA块来保留实际文本。两种方法都可以,但是取决于转换发生的位置(例如通过JS在浏览器级别),编码实体的输出可能会有所不同。


嗨,不幸的是,这会使标签以纯文本形式显示 - 也就是说,没有应用任何格式。我使用<xsl:output method="html" ... />修复了它。无论如何,谢谢。 - Hallgeir

0
你可以更改 XML 文件的生成方式,将内容放在 <![CDATA[ ]]> 部分中,告诉解析器忽略该部分内的特殊内容。

嗨,不幸的是,这会使标签以纯文本形式显示 - 也就是说,没有应用任何格式。我使用<xsl:output method="html" ... />修复了它。无论如何,谢谢。 - Hallgeir

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