XSLT空XML值删除父端标记
我对XSL转换有问题。我有一个密码:XSLT空XML值删除父端标记,xml,xslt,Xml,Xslt,我对XSL转换有问题。我有一个密码: <span class="A"> <xsl:value-of select="FIELD_A" /> </span> <span class="B"> <xsl:value-of select="FIELD_B" /> </span> 我的浏览器将创建: <span class="A"> <span class="B"> VALUE B </sp
<span class="A"> <xsl:value-of select="FIELD_A" /> </span>
<span class="B"> <xsl:value-of select="FIELD_B" /> </span>
我的浏览器将创建:
<span class="A">
<span class="B"> VALUE B </span>
</span>
B值
这是我的xslt文件的头
<?xml version="1.0" encoding="ISO-8859-2" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
您知道为什么要删除该范围的结束标记,以及如何修复它吗?我想您没有正确的XSLT输出方法将HTML作为
text/HTML
,如果您想创建HTML并通过浏览器解析为text/HTML
,请使用
。否则,XSLT处理器可能会将空的span
元素序列化为
,然后HTML 5解析算法确实会将foo
序列转换为两个嵌套的span
元素,可在“实时DOM查看器”中查看
如果您有xsl:output method=“html”
,但没有得到正确的解析,那么要么您没有让XSLT处理器序列化XSLT转换结果,要么您涉及到名称空间
根据您的编辑,XSLT不会生成HTML4或5,而是生成XHTML(正如名称空间声明
所示)。你有必要这么做吗?XSLT1要生成text/html
,就更容易避免对html元素使用任何名称空间。如果使用XSLT 2或3处理器(例如,可以在Java下使用Saxon 9),那么如果需要名称空间,但希望浏览器将结果解析为文本/html
,则可以将输出方法更改为
如果您需要名称空间并需要使用XSLT 1,那么我建议使用
,但要确保浏览器以应用程序/xhtml+xml
的形式获取内容,而不是以文本/html
的形式获取内容。但是,许多使用旧的文档的脚本库。write
和其他东西在解析为XML的XHTML中不起作用,因此这种方法有其缺陷,这取决于结果文档使用的其他资源,如Javascript代码。我猜您没有正确的XSLT输出方法将HTML作为文本/HTML
,如果您希望创建HTML,并通过浏览器将其解析为文本/HTML
,请使用
。否则,XSLT处理器可能会将空的span
元素序列化为
,然后HTML 5解析算法确实会将foo
序列转换为两个嵌套的span
元素,可在“实时DOM查看器”中查看
如果您有xsl:output method=“html”
,但没有得到正确的解析,那么要么您没有让XSLT处理器序列化XSLT转换结果,要么您涉及到名称空间
根据您的编辑,XSLT不会生成HTML4或5,而是生成XHTML(正如名称空间声明
所示)。你有必要这么做吗?XSLT1要生成text/html
,就更容易避免对html元素使用任何名称空间。如果使用XSLT 2或3处理器(例如,可以在Java下使用Saxon 9),那么如果需要名称空间,但希望浏览器将结果解析为文本/html
,则可以将输出方法更改为
如果您需要名称空间并需要使用XSLT 1,那么我建议使用
,但要确保浏览器以应用程序/xhtml+xml
的形式获取内容,而不是以文本/html
的形式获取内容。但是许多使用旧的document.write
和其他东西的脚本库在解析为XML的XHTML中不起作用,因此这种方法有其缺陷,这取决于结果文档使用的Javascript代码等其他资源。那么,在特定浏览器中是否存在HTML解析问题?到底是哪个浏览器?您是在浏览器中还是在服务器上运行XSLT?在“您的”浏览器操作之前,您到底使用哪种xsl:output
方法,XSLT处理器输出的HTML结果是什么样子的?在Chrome、Firefox和Edge中的输出是相同的。XSLT正在服务器上运行xsl:output
方法设置为HTML
。我不知道我的浏览器是否在操纵它——这只是我的猜测。我已经检查过了,在浏览器操纵html之前,那里有一个自关闭的span标记:
您是在浏览器中还是在服务器上运行XSLT转换?如果在服务器上,请查看在发送到浏览器之前生成的实际文件。@MichaelKay在被浏览器解析之前,存在自关闭的span标记。因此,在特定浏览器中,这是HTML解析问题吗?到底是哪个浏览器?您是在浏览器中还是在服务器上运行XSLT?在“您的”浏览器操作之前,您到底使用哪种xsl:output
方法,XSLT处理器输出的HTML结果是什么样子的?在Chrome、Firefox和Edge中的输出是相同的。XSLT正在服务器上运行xsl:output
方法设置为HTML
。我不知道我的浏览器是否在操纵它——这只是我的猜测。我已经检查过了,在浏览器操纵html之前,那里有一个自关闭的span标记:
您是在浏览器中还是在服务器上运行XSLT转换?如果在服务器上,请查看在发送到浏览器之前生成的实际文件。@MichaelKay在被浏览器解析之前,有一个自关闭的span标记。我已将XSLT头添加到顶部的帖子中。我正在使用javax.xml.transform.Transformer
来转换xml。@bartex9,请参阅编辑,带有名称空间(任何名称空间)您打开html
根目录,XSLT处理器将不使用XML元素对这些元素的html序列化规则。相关:您可以通过在运行时填充空白来欺骗MS XslCompiledTransform引擎为XML创建关闭标记。看@MartinHonnen你当然是对的。删除该名称空间解决了这个问题。我已经将XSLT头添加到顶部的帖子中。我正在使用javax.xml.transform.Transformer
来转换xml。@bartex9,请参阅编辑,并在ht上添加名称空间(任何名称空间)
<span class="A">
<span class="B"> VALUE B </span>
</span>
<?xml version="1.0" encoding="ISO-8859-2" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">