XSLT将文本/特殊字符转换为HTML

XSLT将文本/特殊字符转换为HTML,xslt,Xslt,在我的XML文件中,我有以下节点,其中包含为保留字符进行HTML编码的文本内容: <seg>&lt;div style="position:relative;padding-bottom:56.25%;padding-top:10px;height:0;overflow:hidden;"&gt;&lt;iframe src="https://www.example.com/video/fmsh/embed.1/subject.27453" style="pos

在我的XML文件中,我有以下节点,其中包含为保留字符进行HTML编码的文本内容:

<seg>&lt;div style="position:relative;padding-bottom:56.25%;padding-top:10px;height:0;overflow:hidden;"&gt;&lt;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"&gt;&lt;/iframe&gt;&lt;/div&gt;</seg>
产出:

<?javax.xml.transform.disable-output-escaping?>&lt;div style="position:relative;padding-bottom:56.25%;padding-top:10px;height:0;overflow:hidden;"&gt;&lt;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"&gt;&lt;/iframe&gt;&lt;/div&gt;<?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
    属性中有一个未被转换的
    &
  • HTML属性
    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>