Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT呈现HTML br标记不一致_Html_Xslt_Xhtml_Itext - Fatal编程技术网

XSLT呈现HTML br标记不一致

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的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输出
使用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 = '&#160;'
        <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 = '&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 = '&#160;'
        <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="&#160;" string="&amp;nbsp;"/>
</xsl:character-map>

<xsl:template match="/">
  <html>
      <head>
        <title>Test Instance</title>
      </head>   
      <body>
        <xsl:value-of select="/root/element1/child2" />
        <br/>
        NBSP = '&#160;'
        <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 = '&#160;'
        <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 = '&#160;'
        <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>