首页 > 解决方案 > 源文件中的长文本字符串,导致输出文件中出现多行

问题描述

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

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

在“xsl:output”中,我设置了属性“suppress-indentation”,但看起来该属性只控制节点元素(标签)的缩进,而不是节点值的长度。

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

有没有办法控制 XSLT 何时判断将长字符串切割成几行的长度?

我的环境:

您可以在 xsltfiddle 中看到行为: https ://xsltfiddle.liberty-development.net/jxWZS72/4

数据:

<?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>

XSL:

<?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>

标签: xmlxsltsaxonxslt-3.0

解决方案


看起来您的“测试平台”依赖于 XSLT 规范不需要的行为,并且实际应用程序可能不需要。在这种情况下,最好的办法一般是放宽对测试台的要求,以免对转换输出提出不合理的要求。

无论如何,测试序列化的 XML 输出总是很棘手,尤其是在indent="yes"已设置时,这使得输出实现的许多方面都是定义的。

您正在使用,但在序列化输出中suppress-indentation="content"没有调用元素。content您是否尝试过`suppress-indentation="string-one string-two"?我认为这应该按照规范工作;如果没有,我们可能应该修复它。

但我认为您可能应该回顾一下您是如何进行测试的。比较序列化的缩进输出对于舒适来说太脆弱了。


推荐阅读