微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决源文件中的长文本字符串,导致输出文件中的多行

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

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

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

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

有没有办法控制XSLT什么时候判断将一个长字符串剪成几行的长度?

我的环境:

  • 来自 Saxonica 的 Saxon-HE 10.5J

  • Java 版本 11.0.11

您可以在 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,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,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,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,quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </string-one>
      <string-two>Lorem ipsum dolor sit amet,sed do eiusmod tempor incididunt</string-two>
   </body>
</html>

解决方法

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

无论如何,测试序列化的 XML 输出总是很棘手,尤其是在设置了 GetMapping("/findClients/{from}/{to}") public ResponseEntity<?> getRegisteredClients(@PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDateTime from,@PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDateTime to) { try { return ResponseEntity.status(HttpStatus.OK).body(clientService.findRegisteredClients(from,to)); } catch (Exception e) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body("{\"message\": \"Error. Please try again later.\"}"); } } 时,这使得输出实现的许多方面都已定义。

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

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

,

我写了测试用例

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

针对从样本中获取的输入运行它

<text>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.</text>

即使使用 Saxon 10.5,结果也显示 suppress-indentation 没有被考虑,因为输出是

<!DOCTYPE HTML><html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>suppress-indenation test in p string-data</title>
   </head>
   <body>
      <h1 data-suppress-indentation-in="p string-data">suppress-indentation test in p string-data</h1>
      <section>
         <h2>div</h2>
         <div>Lorem ipsum dolor sit amet,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.</div>
      </section>
      <section>
         <h2>p</h2>
         <p>Lorem ipsum dolor sit amet,quis nostrud exercitation
            ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
      </section>
      <section>
         <h2>string-data</h2>
         <string-data>Lorem ipsum dolor sit amet,quis nostrud exercitation
            ullamco laboris nisi ut aliquip ex ea commodo consequat.</string-data>
      </section>
      <section>
         <h2>pre</h2>
         <pre>Lorem ipsum dolor sit amet,quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</pre>
      </section>
      <section>
         <h2>span</h2><span>Lorem ipsum dolor sit amet,quis nostrud exercitation
            ullamco laboris nisi ut aliquip ex ea commodo consequat.</span></section>
   </body>
</html><!--Run with SAXON HE 10.5.1 -->

正如https://www.w3.org/TR/xslt-xquery-serialization-31/#HTML_INDENT所说:

不能在元素的内容中添加空格字符 其扩展 QName 与扩展 QName 列表的成员匹配 在suppress-indentation参数的值中

我认为 Saxon 有一个错误:https://saxonica.plan.io/issues/5018

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。