我有一个像这样的示例xml文件,
<doc>
<p>text1 text2 </p>
<p>text1 text2 </p>
<p>text1 text2 </p>
</doc>
Run Code Online (Sandbox Code Playgroud)
这个示例xml,第一个<p>有空格空格字符( ),第二个<p>有制表符空白空格字符(	),第三个<p>空格不空格字符( ).
我需要删除关闭标签之前出现的任何空白区域.
所以,预期的产量应该是,
<doc>
<p>text1 text2</p>
<p>text1 text2</p>
<p>text1 text2</p>
</doc>
Run Code Online (Sandbox Code Playgroud)
通过使用xslt normalize-space(),我可以删除不必要的空格和制表符,但不能删除不间断的空白字符.
<xsl:template match="p/text()">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
有什么建议我如何规范化所有空格,包括xslt中不间断的空格?
你可以这样做:
<xsl:value-of select="normalize-space(translate(., ' ', ' '))"/>
Run Code Online (Sandbox Code Playgroud)
这将适用于XSLT 1.0和2.0.
在XSLT 2.0中,您还可以使用正则表达式 - 例如:
<xsl:value-of select="replace(., '[\t\p{Zs}]', '')"/>
Run Code Online (Sandbox Code Playgroud)
将删除水平制表符以及Unicode Space_Separator类别中的任何字符,其中不仅包括空格和非空格字符,还包括其他空格字符.文档很难找到,但我相信这是目前的完整列表:(摘自http://www.unicode.org/Public/UNIDATA/UnicodeData.txt):
  SPACE
  NO-BREAK SPACE
  OGHAM SPACE MARK
  EN QUAD
  EM QUAD
  EN SPACE
  EM SPACE
  THREE-PER-EM SPACE
  FOUR-PER-EM SPACE
  SIX-PER-EM SPACE
  FIGURE SPACE
  PUNCTUATION SPACE
  THIN SPACE
  HAIR SPACE
  NARROW NO-BREAK SPACE
  MEDIUM MATHEMATICAL SPACE
  IDEOGRAPHIC SPACE
𐲰 OLD HUNGARIAN CAPITAL LETTER EZS
𐳰 OLD HUNGARIAN SMALL LETTER EZS
𖼶 MIAO LETTER ZSHA
𖼼 MIAO LETTER ZSA
𖼾 MIAO LETTER ZZSA
𖽁 MIAO LETTER ZZSYA
Run Code Online (Sandbox Code Playgroud)
但是,使用Saxon 9.5进行测试表明最后6个字符无法识别:http://xsltransform.net/ncntCSo