XSLT- 规范化不间断空白字符
XSLT- normalize non-breaking whitespace characters
我有一个这样的示例 xml 文件,
<doc>
<p>text1 text2 </p>
<p>text1 text2 </p>
<p>text1 text2 </p>
</doc>
这个样本 xml,第一个 <p>
有 space 白色 space 字符 ( 
),第二个 <p>
有制表符白色space whitespace 字符 (	
) 第三个 <p>
有 space 不间断的 whitespace 字符 ( 
).
我需要删除关闭标签之前出现的所有白色 space。
所以,预期的输出应该是,
<doc>
<p>text1 text2</p>
<p>text1 text2</p>
<p>text1 text2</p>
</doc>
通过使用 xslt normalize-space() 我可以删除不必要的 spaces 和制表符,但不能删除不间断的白色 space 字符。
<xsl:template match="p/text()">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
关于如何在 xslt 中规范化所有白色 space 包括不间断白色 spaces 的任何建议?
你可以这样做:
<xsl:value-of select="normalize-space(translate(., ' ', ' '))"/>
这在 XSLT 1.0 和 2.0 中同样有效。
在 XSLT 2.0 中,您还可以使用正则表达式 - 例如:
<xsl:value-of select="replace(., '[\t\p{Zs}]', '')"/>
将删除水平制表符以及 Unicode Space_Separator
类别中的任何字符,其中不仅包括 space 和不间断的 space 字符,还包括其他 space 个字符。文档很难找到,但我相信这是目前完整的列表:(摘自 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
但是,使用 Saxon 9.5 进行的测试表明无法识别最后 6 个字符:http://xsltransform.net/ncntCSo
我有一个这样的示例 xml 文件,
<doc>
<p>text1 text2 </p>
<p>text1 text2 </p>
<p>text1 text2 </p>
</doc>
这个样本 xml,第一个 <p>
有 space 白色 space 字符 ( 
),第二个 <p>
有制表符白色space whitespace 字符 (	
) 第三个 <p>
有 space 不间断的 whitespace 字符 ( 
).
我需要删除关闭标签之前出现的所有白色 space。
所以,预期的输出应该是,
<doc>
<p>text1 text2</p>
<p>text1 text2</p>
<p>text1 text2</p>
</doc>
通过使用 xslt normalize-space() 我可以删除不必要的 spaces 和制表符,但不能删除不间断的白色 space 字符。
<xsl:template match="p/text()">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
关于如何在 xslt 中规范化所有白色 space 包括不间断白色 spaces 的任何建议?
你可以这样做:
<xsl:value-of select="normalize-space(translate(., ' ', ' '))"/>
这在 XSLT 1.0 和 2.0 中同样有效。
在 XSLT 2.0 中,您还可以使用正则表达式 - 例如:
<xsl:value-of select="replace(., '[\t\p{Zs}]', '')"/>
将删除水平制表符以及 Unicode Space_Separator
类别中的任何字符,其中不仅包括 space 和不间断的 space 字符,还包括其他 space 个字符。文档很难找到,但我相信这是目前完整的列表:(摘自 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
但是,使用 Saxon 9.5 进行的测试表明无法识别最后 6 个字符:http://xsltransform.net/ncntCSo