Xml 源文件中的长文本字符串,导致输出文件中出现多行

Xml 源文件中的长文本字符串,导致输出文件中出现多行,xml,xslt,saxon,xslt-3.0,Xml,Xslt,Saxon,Xslt 3.0,我需要在技术测试台上运行XSLT生成的输出文件(XHTML) 每次我使用长文本字符串(来自源文件)并执行XSLT时,测试台都不会批准该文档。原因似乎是输出文件(XHTML)采用了长文本字符串并将其拆分为几行 在“xsl:output”中,我设置了属性“抑制缩进”,但该属性似乎只控制节点元素(标记)的缩进,而不是节点值的长度 在我的环境中,我还控制了终端中的输出文件,以确保问题不仅仅局限于我的编程文本编辑器 有没有一种方法可以控制XSLT判断将长字符串剪切成几行的时间长度 我的环境: Saxon

我需要在技术测试台上运行XSLT生成的输出文件(XHTML)

每次我使用长文本字符串(来自源文件)并执行XSLT时,测试台都不会批准该文档。原因似乎是输出文件(XHTML)采用了长文本字符串并将其拆分为几行

在“xsl:output”中,我设置了属性“抑制缩进”,但该属性似乎只控制节点元素(标记)的缩进,而不是节点值的长度

在我的环境中,我还控制了终端中的输出文件,以确保问题不仅仅局限于我的编程文本编辑器

有没有一种方法可以控制XSLT判断将长字符串剪切成几行的时间长度

我的环境:

  • Saxon他从Saxonica得到10.5J

  • Java版本11.0.11

您可以在xsltfiddle中看到该行为:

数据:

<?xml version="1.0" encoding="utf-8" ?>
<data>
    <content-cut>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</content-cut>
    <content-no-cut>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</content-no-cut>
</data>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="3.0"
>

  <xsl:output method="xhtml" indent="yes" suppress-indentation="content" html-version="5"/>

  <xsl:template match="data">
    <html>
      <head>
        <title>MyTitle</title>
      </head>
      <body>
          
        <string-one>
            <xsl:value-of select="content-cut"/>
        </string-one>
        
        <string-two>
            <xsl:value-of select="content-no-cut"/>
        </string-two>  

      </body>
    </html>
    
  </xsl:template>
  
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html><html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>MyTitle</title></head>
   <body>
      <string-one>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
         ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
         ullamco laboris nisi ut aliquip ex ea commodo consequat.
      </string-one>
      <string-two>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</string-two>
   </body>
</html>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html><html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>MyTitle</title></head>
   <body>
      <string-one>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </string-one>
      <string-two>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</string-two>
   </body>
</html>

知识产权是一种权利,是一种精英的权利,是劳动和财富的暂时性权利。但是,在最低限度上,我们需要一个实验室来进行日常工作。
Lorem ipsum Door sit amet,是一位杰出的领导者,他是一位临时顾问
XSL:

<?xml version="1.0" encoding="utf-8" ?>
<data>
    <content-cut>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</content-cut>
    <content-no-cut>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</content-no-cut>
</data>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="3.0"
>

  <xsl:output method="xhtml" indent="yes" suppress-indentation="content" html-version="5"/>

  <xsl:template match="data">
    <html>
      <head>
        <title>MyTitle</title>
      </head>
      <body>
          
        <string-one>
            <xsl:value-of select="content-cut"/>
        </string-one>
        
        <string-two>
            <xsl:value-of select="content-no-cut"/>
        </string-two>  

      </body>
    </html>
    
  </xsl:template>
  
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html><html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>MyTitle</title></head>
   <body>
      <string-one>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
         ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
         ullamco laboris nisi ut aliquip ex ea commodo consequat.
      </string-one>
      <string-two>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</string-two>
   </body>
</html>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html><html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>MyTitle</title></head>
   <body>
      <string-one>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </string-one>
      <string-two>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</string-two>
   </body>
</html>

我的头衔
结果:

<?xml version="1.0" encoding="utf-8" ?>
<data>
    <content-cut>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</content-cut>
    <content-no-cut>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</content-no-cut>
</data>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="3.0"
>

  <xsl:output method="xhtml" indent="yes" suppress-indentation="content" html-version="5"/>

  <xsl:template match="data">
    <html>
      <head>
        <title>MyTitle</title>
      </head>
      <body>
          
        <string-one>
            <xsl:value-of select="content-cut"/>
        </string-one>
        
        <string-two>
            <xsl:value-of select="content-no-cut"/>
        </string-two>  

      </body>
    </html>
    
  </xsl:template>
  
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html><html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>MyTitle</title></head>
   <body>
      <string-one>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
         ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
         ullamco laboris nisi ut aliquip ex ea commodo consequat.
      </string-one>
      <string-two>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</string-two>
   </body>
</html>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html><html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>MyTitle</title></head>
   <body>
      <string-one>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </string-one>
      <string-two>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</string-two>
   </body>
</html>

我的头衔
Lorem ipsum Door sit amet,是一位杰出的领导者,他是一位临时顾问
我们的劳动和财富都是巨大的。我们需要一个最低限度的练习
ullamco laboris nisi和aliquip ex ea commodo consequat。
Lorem ipsum Door sit amet,是一位杰出的领导者,他是一位临时顾问
想要的结果:

<?xml version="1.0" encoding="utf-8" ?>
<data>
    <content-cut>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</content-cut>
    <content-no-cut>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</content-no-cut>
</data>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="3.0"
>

  <xsl:output method="xhtml" indent="yes" suppress-indentation="content" html-version="5"/>

  <xsl:template match="data">
    <html>
      <head>
        <title>MyTitle</title>
      </head>
      <body>
          
        <string-one>
            <xsl:value-of select="content-cut"/>
        </string-one>
        
        <string-two>
            <xsl:value-of select="content-no-cut"/>
        </string-two>  

      </body>
    </html>
    
  </xsl:template>
  
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html><html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>MyTitle</title></head>
   <body>
      <string-one>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
         ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation
         ullamco laboris nisi ut aliquip ex ea commodo consequat.
      </string-one>
      <string-two>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</string-two>
   </body>
</html>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html><html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>MyTitle</title></head>
   <body>
      <string-one>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </string-one>
      <string-two>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt</string-two>
   </body>
</html>

我的头衔
知识产权是一种权利,是一种精英的权利,是劳动和财富的暂时性权利。但是,在最低限度上,我们需要一个实验室来进行日常工作。
Lorem ipsum Door sit amet,是一位杰出的领导者,他是一位临时顾问
看起来您的“测试台”依赖的行为不是XSLT规范所要求的,也可能不是实际应用程序所要求的。在这种情况下,最好的方法通常是放宽测试台的要求,这样就不会对转换输出施加不合理的要求

无论如何,测试序列化的XML输出总是很棘手的,特别是当设置了
indent=“yes”
时,这会定义输出实现的许多方面

您正在使用
suppress indentation=“content”
,但在序列化输出中没有名为
content
的元素。您是否尝试过“抑制缩进=”字符串一字符串二“?我认为应该按照规范工作;如果没有,我们可能应该修复它

但我认为你应该回顾一下你是如何进行测试的。比较序列化的缩进输出太脆弱了,让人感到不舒服。

我编写了测试用例

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  expand-text="yes">
  
  <xsl:param name="suppress-indentation-in" as="xs:string*" static="yes" select="'p', 'string-data'"/>
  
  <xsl:param name="test-elements" as="xs:string*" static="yes" select="'div', $suppress-indentation-in, 'pre', 'span',"/>

  <xsl:output method="html" indent="yes" html-version="5.0" _suppress-indentation="{$suppress-indentation-in}"/>
  
  <xsl:mode on-multiple-match="use-last"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>suppress-indenation test in {$suppress-indentation-in}</title>
      </head>
      <body>
        <h1 data-suppress-indentation-in="{$suppress-indentation-in}">suppress-indentation test in {$suppress-indentation-in}</h1>
        <xsl:iterate select="$test-elements">
          <xsl:param name="root" select="*"/>
          <section>
            <h2>{.}</h2>
            <xsl:element name="{.}">{$root}</xsl:element>
          </section>
        </xsl:iterate>
      </body>
    </html>
  </xsl:template>
  
  <xsl:template match="/" name="xsl:initial-template">
    <xsl:next-match/>
    <xsl:comment xmlns:saxon="http://saxon.sf.net/">Run with {system-property('xsl:product-name')} {system-property('xsl:product-version')} {system-property('Q{http://saxon.sf.net/}platform')}</xsl:comment>
  </xsl:template>

</xsl:stylesheet>
潘洛雷姆·伊普苏姆·多洛·希特,一位杰出的领袖,他是一位临时总统 我们的劳动和财富都是巨大的。我们需要一个最低限度的练习 ullamco laboris nisi和aliquip ex ea commodo consequat。 正如上面所说:

不能在元素的内容中添加空白字符 其扩展QName与扩展QName列表中的成员匹配 在“抑制缩进”参数的值中

我认为撒克逊人有一个错误:


唯一的解决方法似乎是使用
pre
元素。

众所周知,Saxon会在段落中插入换行符以提高可读性。如果使用标识,我认为商业版有一个专有的输出属性,通过将非常高的行长设为默认值,理论上可以改变这一点。我不记得他是否有一个简单的解决办法;一方面依靠缩进,另一方面又希望保留某些格式,这是一种困难的方法。has
saxon:line length
,默认值为
80
,“使用HTML输出方法,文本行尽可能按此行长度分割。”。规范建议,例如,对于
pre
元素,内容中不应添加空格,我认为saxon可能会这样做,由于
stringone
stringtwo
不是任何HTML元素,请改用
pre
。我认为从技术上讲,
suppress indentation=“string one string two”
也应该有效,但让我们看看Michael Kay是怎么说的。我更新了这个问题,在“suppress indentation”中用适当的值更新了xsltfiddle。这一具体变化并没有改善结果。我同意,将indent=“yes”与避免在元素值中剪切长字符串的需要相结合会带来错误和不稳定性。-然而,在这种特殊情况下,测试台不在我的范围内,因此我不能“放松”它。它对于能够控制和调整元素值的最大可接受文本宽度的测试变体是有用的。我测试了预标记包装。它在XSLTFidle中工作,并在我的环境中生成输出文件(XHTML)。虽然测试字符串的宽度是文档的两倍,但在web浏览器中控制输出文件会产生结果。这可能是正常的,因为使用了预标记,但文本字符串的宽度并没有和文档的其余部分对齐。如果没有预标记,internet浏览器可以接收XHTML和figure格式的很长文本字符串