如何在 XSLT 中将空白序列替换为一个空格但不进行修剪?

发布于 2024-10-18 05:45:11 字数 181 浏览 4 评论 0原文

函数 normalize-space 删除前导和尾随空白,并用单个空格替换空白字符序列。在 XSLT 1.0 中,如何用单个空格替换空白字符序列?例如,"..xy..\n\t..z."(为了便于阅读,用点替换空格)应变为".xyz"

The function normalize-space removes leading and trailing whitespace and replaces sequences of whitespace characters by a single space. How can I only replaces sequences of whitespace characters by a single space in XSLT 1.0? For instance "..x.y...\n\t..z." (spaces replaced by a dot for readability) should become ".x.y.z.".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

二手情话 2024-10-25 05:45:11

使用此 XPath 1.0 表达式

concat(substring(' ', 1 + not(substring(.,1,1)=' ')), 
       normalize-space(), 
       substring(' ', 1 + not(substring(., string-length(.)) = ' '))
      )

要验证这一点,请进行以下转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="text()">
  <xsl:value-of select=
  "concat(substring(' ', 1 + not(substring(.,1,1)=' ')),
          normalize-space(),
          substring(' ', 1 + not(substring(., string-length(.)) = ' '))
          )
  "/>
 </xsl:template>
</xsl:stylesheet>

应用于此 XML 文档时:

<t>
 <t1>   xxx   yyy   zzz   </t1>
 <t2>xxx   yyy   zzz</t2>
 <t3>  xxx   yyy   zzz</t3>
 <t4>xxx   yyy   zzz  </t4>
</t>

产生所需的正确结果结果:

<t>
   <t1> xxx yyy zzz </t1>
   <t2>xxx yyy zzz</t2>
   <t3> xxx yyy zzz</t3>
   <t4>xxx yyy zzz </t4>
</t>

Use this XPath 1.0 expression:

concat(substring(' ', 1 + not(substring(.,1,1)=' ')), 
       normalize-space(), 
       substring(' ', 1 + not(substring(., string-length(.)) = ' '))
      )

To verify this, the following transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="text()">
  <xsl:value-of select=
  "concat(substring(' ', 1 + not(substring(.,1,1)=' ')),
          normalize-space(),
          substring(' ', 1 + not(substring(., string-length(.)) = ' '))
          )
  "/>
 </xsl:template>
</xsl:stylesheet>

when applied on this XML document:

<t>
 <t1>   xxx   yyy   zzz   </t1>
 <t2>xxx   yyy   zzz</t2>
 <t3>  xxx   yyy   zzz</t3>
 <t4>xxx   yyy   zzz  </t4>
</t>

produces the wanted, correct result:

<t>
   <t1> xxx yyy zzz </t1>
   <t2>xxx yyy zzz</t2>
   <t3> xxx yyy zzz</t3>
   <t4>xxx yyy zzz </t4>
</t>
吃素的狼 2024-10-25 05:45:11

如果没有贝克尔的方法,您可以使用一些 不鼓励 字符作为标记:

translate(normalize-space(concat('',.,'')),'','')

注意:三个函数调用...

或使用任何字符但重复某些表达式:

substring(
   normalize-space(concat('.',.,'.')),
   2,
   string-length(normalize-space(concat('.',.,'.'))) - 2
)

在 XSLT 中,您可以轻松声明变量:

<xsl:variable name="vNormalize" select="normalize-space(concat('.',.,'.'))"/>
<xsl:value-of select="susbtring($vNormalize,2,string-length($vNormalize)-2)"/>

Without Becker's method, you could use some discouraged character as mark:

translate(normalize-space(concat('',.,'')),'','')

Note: Three function calls...

Or with any character but repeating some expression:

substring(
   normalize-space(concat('.',.,'.')),
   2,
   string-length(normalize-space(concat('.',.,'.'))) - 2
)

In XSLT you can easily declare a variable:

<xsl:variable name="vNormalize" select="normalize-space(concat('.',.,'.'))"/>
<xsl:value-of select="susbtring($vNormalize,2,string-length($vNormalize)-2)"/>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文