如何在XSL转换中解释属性中的HTML标记



我有一个现有的函数转换,它将数据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标记。我想标签的解码已经太迟了,没法解释了。

任何想法?我非常感谢你提供的任何帮助。

我认为问题出在数据上。而标签中的文本可以用CDATA… 表示。
<title><![CDATA[<b>Title</b>]]></title>

也许问题在于您试图将XML表示为已经是XML的文本,为什么不简单地使用<title><b>title</b></title>呢?您将免费获得XML格式良好性检查,如果您希望<title>中的元素执行操作,您可以使用XSLT处理它们(目前将其视为文本,因此您可以使用它做的事情非常有限)。

. .而且,属性中的数据处理起来要困难得多。首先,CDATA不能在属性中工作。所以我尝试了HTML编码。

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

哎呀,你是说你把XML作为文本的属性吗?如果你能阻止……你会省去很多麻烦的。XML中的属性包含扁平值,而不是结构化内容。

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

我想你的意思不是"it shows…"在"变换"中,作为变换并不显示任何东西。你是指它在浏览器中以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也不允许在属性值中写入标记。

最新更新