XSLT将文本/特殊字符转换为HTML
在我的XML文件中,我有以下节点,其中包含为保留字符进行HTML编码的文本内容:XSLT将文本/特殊字符转换为HTML,xslt,Xslt,在我的XML文件中,我有以下节点,其中包含为保留字符进行HTML编码的文本内容: <seg><div style="position:relative;padding-bottom:56.25%;padding-top:10px;height:0;overflow:hidden;"><iframe src="https://www.example.com/video/fmsh/embed.1/subject.27453" style="pos
<seg><div style="position:relative;padding-bottom:56.25%;padding-top:10px;height:0;overflow:hidden;"><iframe src="https://www.example.com/video/fmsh/embed.1/subject.27453" style="position:absolute;top:0;left:0;width:100%;height: 100%;" width="550" height="306" frameborder="0" allowfullscreen="" scrolling="no"></iframe></div></seg>
产出:
<?javax.xml.transform.disable-output-escaping?><div style="position:relative;padding-bottom:56.25%;padding-top:10px;height:0;overflow:hidden;"><iframe src="https://www.example.com/video/fmsh/embed.1/subject.27453" style="position:absolute;top:0;left:0;width:100%;height: 100%;" width="550" height="306" frameborder="0" allowfullscreen scrolling="no"></iframe></div><?javax.xml.transform.enable-output-escaping?>
div style=“位置:相对;填充底部:56.25%;填充顶部:10px;高度:0;溢出:隐藏;“iframe src=”https://www.example.com/video/fmsh/embed.1/subject.27453“style=“position:绝对;top:0;left:0;width:100%;height:100%;“width=“550”height=“306”frameborder=“0”allowfullscreen scrolling=“no”/iframe/div
二,
输出:nothing要将
元素的内容转换为HTML,只需使用(可选)属性:
并非所有XSLT处理器都支持它,所以请尝试一下。此文件的输出为HTML:
<div style="position:relative;padding-bottom:56.25%;padding-top:10px;height:0;overflow:hidden;"><iframe src="https://www.example.com/video/fmsh/embed.1/subject.27453?width=100%&height=100%" style="position:absolute;top:0;left:0;width:100%;height: 100%;" width="550" height="306" frameborder="0" allowfullscreen scrolling="no"></iframe></div>
您无法使用XSLT处理器轻松地进一步处理此输出,因为它不是格式良好的XML(它是HTML):
@src
属性中有一个未被转换的&
allowfullscreen
没有值(在XML中不可接受)但是如果您真的想进一步处理它,请将结果视为字符串,用
fn:replace()
函数替换有问题的方面,然后使用fn:parse-xml-fragment()
函数输出一致的xml。我尝试了两种解决方案,我在原始问题的末尾发布了XSLT和结果(在清理HTML使其成为格式良好的XML之后)。不幸的是,两者都没有正确地输出HTML……正如我在回答中所写的:并非所有XSLT处理器都支持禁用输出转义
。看来你的不支持。您的XSLT处理器的名称是什么?我正在使用eXist db,它将XSLT转换转交给Saxon。但是经过一些研究,Saxon似乎只支持禁用输出转义
,同时也支持序列化。Saxon的另一种方法是使用扩展函数Saxon:parse-html()。需要Saxon PE或更高版本。@MichaelKay我确实看到了,但不幸的是,我们的eXist安装和web应用程序无法访问Saxon PE+,因为我们是法国人文大学研究中心……因此依赖于开源和免费学术许可证。解析xml片段
应该可以工作(只要输入是格式良好的xml片段)因此,应该禁用输出转义(前提是您的处理器支持该转义,并且是执行序列化的处理器)-请参阅:啊,parse-xml-fragment()
不起作用,因为我使用了的值而不是的副本。现在它工作完美!哈我应该在你的尝试中发现这一点,因为我最初犯了同样的错误。。。
<xsl:template match="seg">
<xsl:value-of select="parse-xml-fragment(./text())"/>
</xsl:template>
<xsl:value-of select="seg" disable-output-escaping="yes" />
<div style="position:relative;padding-bottom:56.25%;padding-top:10px;height:0;overflow:hidden;"><iframe src="https://www.example.com/video/fmsh/embed.1/subject.27453?width=100%&height=100%" style="position:absolute;top:0;left:0;width:100%;height: 100%;" width="550" height="306" frameborder="0" allowfullscreen scrolling="no"></iframe></div>