XSLT呈现HTML br标记不一致
在应用呈现html的XSL时,我观察到了不一致的行为。我的具体问题在下面的代码块后面 XML实例: 我的简单XSLT 我的结果输出 因此,我的两个具体问题如下: 根模板呈现的“br”标记保持一致 在渲染输出中处于关闭状态,而从应用的变换中渲染的不处于关闭状态。我对它应该呈现的方式的理解是,所有的“br”标记都将保持打开状态。有人能解释为什么会发生这种情况吗?如果我使用saxon he 9.0.3.5将输出方法更改为“xhtml”,或者使用任何其他解析器将输出方法更改为“xml”,那么它将通过关闭所有标记来一致地呈现“br”标记。 我的第二个问题与插入html输出的非阻塞空间的处理有关。当呈现为输出并使用默认UTF-8编码时,它会显式显示非中断空间,而将输出指定为xhtml或xml会导致空间呈现为C2 A0,这是非中断空间的UTF-8表示形式。对于为什么它将其呈现为针对xhtml而不是针对html的UTF-8,有什么想法吗?虽然我猜测这是因为xhtml与html的解析方式不同,但我发现某些xhtml解析器,尤其是iText XMLWorker,没有正确地解码表示为UTF-8代码的非中断空间,我正在试图找出解决方法。 谢谢XSLT2.0,html输出 XSLT2.0,xhtml输出,强制不是一个好主意 XSLT2.0,xhtml输出,正确的方法 XSLT1.0,xhtml输出XSLT呈现HTML br标记不一致,html,xslt,xhtml,itext,Html,Xslt,Xhtml,Itext,在应用呈现html的XSL时,我观察到了不一致的行为。我的具体问题在下面的代码块后面 XML实例: 我的简单XSLT 我的结果输出 因此,我的两个具体问题如下: 根模板呈现的“br”标记保持一致 在渲染输出中处于关闭状态,而从应用的变换中渲染的不处于关闭状态。我对它应该呈现的方式的理解是,所有的“br”标记都将保持打开状态。有人能解释为什么会发生这种情况吗?如果我使用saxon he 9.0.3.5将输出方法更改为“xhtml”,或者使用任何其他解析器将输出方法更改为“xml”,那么它将通过关闭
使用HTML输出方法,br元素被特殊地处理为仅当它不在名称空间中时才被呈现 使用XHTML输出方法,br元素被特殊地处理为仅当它位于XHTML名称空间中时
XSLT 3.0支持method=html version=5,其中不接受名称空间和XHTML名称空间。这一点在XSLT 3.0中有所改变。WRT 2,XML文件默认定义为具有UTF-8,除非您发出XML声明,将其更改为不重要,并且转换认为这是有效的。C2 A0比&160;短;。让我们看看我能想出什么。我也不确定我是否喜欢下面两个br元素中的xmlns=。顺便说一句,这听起来像是两个不同的问题,所以最好是作为两个独立的问题。除非我们能找到一个同时解决这两个问题的解决方案。您如何检索输出?我从具有正常brs的模板XXXXXX获得测试实例XXXXXX NBSP=''调用。样式表中存在基本不一致。xmlns=http://www.w3.org/1999/xhtml 声明您正在以xml格式输出xhtml。所以对于xhtml,您应该选择method=xml。如果您想要HTML5,那么不应该使用xhtml名称空间。不清楚您想要的输出格式是什么:html?或者html中的xthml.1,在输出到空名称空间的//element1模板中;但是在match=/template中,您是在xhtml名称空间中输出的。这是完全不同的。这就解释了区别。在使用XSLT2.0生成XHTML的地方,我认为应该将结果树元素放入XHTML名称空间。这很好地解释了这一点。当与@sean的文章结合使用时,这是一个相当全面的答案,不仅回答了我的问题,而且允许我绕过解析器的限制。。谢谢
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element1>
<child2>XXXXXX</child2>
</element1>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test Instance</title>
</head>
<body>
<xsl:value-of select="/root/element1/child2"/>
<br/>
NBSP = ' '
<br/>
<xsl:apply-templates select="//element1"/>
</body>
</html>
</xsl:template>
<xsl:template match="//element1">
Call From Template:
<br/>
<xsl:value-of select="./child2"/>
<br/>
</xsl:template>
</xsl:stylesheet>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test Instance</title>
</head>
<body>XXXXXX<br></br>
NBSP = ' '
<br></br>
Call From Template:
<br xmlns="">XXXXXX<br xmlns=""></body>
</html>
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="html" version="5" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<html>
<head>
<title>Test Instance</title>
</head>
<body>
<xsl:value-of select="/root/element1/child2" />
<br/>
NBSP = ' '
<br/>
<xsl:apply-templates select="//element1" />
</body>
</html>
</xsl:template>
<xsl:template match="//element1">
Call From Template:
<br />
<xsl:value-of select="./child2" />
<br />
</xsl:template>
</xsl:transform>
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xhtml" encoding="UTF-8" indent="yes" use-character-maps="a" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:character-map name="a">
<xsl:output-character character=" " string="&nbsp;"/>
</xsl:character-map>
<xsl:template match="/">
<html>
<head>
<title>Test Instance</title>
</head>
<body>
<xsl:value-of select="/root/element1/child2" />
<br/>
NBSP = ' '
<br/>
<xsl:apply-templates select="//element1" />
</body>
</html>
</xsl:template>
<xsl:template match="//element1">
Call From Template:
<br />
<xsl:value-of select="./child2" />
<br />
</xsl:template>
</xsl:transform>
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:output method="xhtml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<html>
<head>
<title>Test Instance</title>
</head>
<body>
<xsl:value-of select="/root/element1/child2" />
<br/>
NBSP = ' '
<br/>
<xsl:apply-templates select="//element1" />
</body>
</html>
</xsl:template>
<xsl:template match="//element1">
Call From Template:
<br />
<xsl:value-of select="./child2" />
<br />
</xsl:template>
</xsl:transform>
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<html>
<head>
<title>Test Instance</title>
</head>
<body>
<xsl:value-of select="/root/element1/child2" />
<br/>
NBSP = ' '
<br/>
<xsl:apply-templates select="//element1" />
</body>
</html>
</xsl:template>
<xsl:template match="//element1">
Call From Template:
<br />
<xsl:value-of select="./child2" />
<br />
</xsl:template>
</xsl:transform>