如何在一个空格中替换空格序列,但不在XSLT中修剪?

时间:2011-02-17 22:28:39

标签: xslt xpath xslt-1.0 removing-whitespace

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

2 个答案:

答案 0 :(得分:7)

使用此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>

答案 1 :(得分:2)

如果没有Becker的方法,您可以使用一些discouraged字符作为标记:

translate(normalize-space(concat('&#x7F;',.,'&#x7F;')),'&#x7F;','')

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

或者任何角色,但重复一些表达:

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)"/>