【问题标题】:How to interpret HTML tags in attributes in XSL transformations?如何在 XSL 转换中解释属性中的 HTML 标记?
【发布时间】:2015-09-03 13:35:36
【问题描述】:

我有一个现有的功能转换,它将数据 XML 文件转换为漂亮而闪亮的 HTML 文档。

现在我想强调一些特殊条件下的数据。我的第一个想法是使用一些 HTML 标签。 它在一定程度上起作用。

第一个重要步骤是在 XSLT 文件中转换后启用 HTML 解释。

<xsl:value-of select="$title" disable-output-escaping="yes"/>

我认为问题在于数据。虽然标签中的文本可以用 CDATA 来表示...

<title><![CDATA[<b>Title</b>]]></title>

... 并且有效,属性中的数据更难处理。首先,CDATA 不能在属性中工作。所以我尝试了 HTML 编码。

&lt;b&gt;Text&lt;/b&gt;

但这不会解释,它会在转换中显示带有或不带 disable-output-escaping="yes" 的 HTML 标签。我认为标签的解码为时已晚。

有什么想法吗?非常感谢您提供的任何帮助。

【问题讨论】:

  • 你能展示一个简单的测试用例吗?测试用例是一个示例输入文档和预期的输出文档。另外,什么版本的 XSLT? 1.0?, 2?还是 3 个?
  • 正如 Sean 所说,但如果您在设置时遇到问题,请查看 SO 的 minimal reproducible example

标签: html xml xslt cdata


【解决方案1】:

我认为问题在于数据。虽然标签中的文本可以用 CDATA 来表示...

<title><![CDATA[<b>Title</b>]]></title>

也许问题在于您试图在已经是 XML 的内容中将 XML 表示为文本,为什么不简单地 &lt;title&gt;&lt;b&gt;title&lt;/b&gt;&lt;/title&gt; 呢?您将免费获得 XML 格式正确性检查,如果您想对 &lt;title&gt; 中的元素进行执行操作,您可以使用 XSLT(目前将其视为文本,因此你可以用它做的事情非常有限)。

.. 并且工作,属性中的数据更难处理。首先,CDATA 不能在属性中工作。所以我尝试了 HTML 编码。

&lt;b&gt;Text&lt;/b&gt;

哎呀,您是说将 XML 作为文本放入属性中?如果你能阻止这种情况......你会为自己省去很多麻烦。 XML 中的属性包含平面值,而不是结构化内容。

但这不会解释,它会在转换中显示带有或不带 disable-output-escaping="yes" 的 HTML 标记。我认为标签的解码解释得太晚了。

我不认为您的意思是“它在转换中显示...”,因为转换不显示任何内容。你的意思是它在浏览器中以 HTML 格式打开时的显示方式?

不,解码还为时不晚。 disable-output-escaping 仅对元素内的文本有效。不在元素名称上,不在属性名称或值上。这可能是在 XSLT 1.0 时代(差不多 20 年前!)的设计选择,但它是有道理的,否则它是另一个创建无效 XML 的邀请。

有什么想法吗?非常感谢您提供的任何帮助。

是的。如果可能的话(我不知道你的情况的范围,有时历史表明我们必须接受过去的设计选择),不要将 XML 或 HTML 作为文本(你称之为 CDATA)存储在标签内,更不用说内部属性了。

如果您对此无能为力,则在转换后,将属性转换为元素内的文本,您的disable-output-escaping 将再次起作用。但无论哪种方式,解决方案充其量都是丑陋的。


顺便说一句:如果您使用服务器端处理并且您遇到了以这种方式存储 XML 的系统,您也许可以切换到 XSLT 3.0,它具有作为 XPath 3.0 的一部分的函数 parse-xml()一个字符串,就像您将其解释为 XML 的字符串一样。这样你就可以验证它并以某种方式处理它。

然而,即使是 XSLT 3.0 也不允许您在属性值内写入标签。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2016-12-12
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多