首页 文章

XSLT-规范化非破坏的空白字符

提问于
浏览
2

我有一个像这样的示例xml文件,

<doc>
    <p>text1 text2  </p>
    <p>text1 text2     </p>
    <p>text1 text2   </p>
</doc>

此示例xml,第一个 <p> 具有空格空白字符( &#x0020; ),第二个 <p> 具有制表符空格空白字符( &#x9; ),第三个 <p> 具有空格不间断空格字符( &#x00A0; ) .

我需要删除在关闭标签之前出现的任何空格 .

所以,预期的产量应该是,

<doc>
    <p>text1 text2</p>
    <p>text1 text2</p>
    <p>text1 text2</p>
</doc>

通过使用xslt normalize-space(),我可以删除不必要的空格和制表符,但不能删除不间断的空白字符 .

<xsl:template match="p/text()">
    <xsl:value-of select="normalize-space()"/>
</xsl:template>

有什么建议我如何规范化所有空格,包括xslt中不间断的空格?

1 回答

  • 5

    你可以这样做:

    <xsl:value-of select="normalize-space(translate(., '&#160;', ' '))"/>
    

    这将适用于XSLT 1.0和2.0 .


    在XSLT 2.0中,您还可以使用正则表达式 - 例如:

    <xsl:value-of select="replace(., '[\t\p{Zs}]', '')"/>
    

    将删除水平制表符以及Unicode Space_Separator 类别中的任何字符,其中不仅包括空格和非空格字符,还包括其他空格字符 . 文档很难找到,但我相信这是目前的完整列表:(摘自http://www.unicode.org/Public/UNIDATA/UnicodeData.txt):

    &#x0020; SPACE
    &#x00A0; NO-BREAK SPACE
    &#x1680; OGHAM SPACE MARK
    &#x2000; EN QUAD
    &#x2001; EM QUAD
    &#x2002; EN SPACE
    &#x2003; EM SPACE
    &#x2004; THREE-PER-EM SPACE
    &#x2005; FOUR-PER-EM SPACE
    &#x2006; SIX-PER-EM SPACE
    &#x2007; FIGURE SPACE
    &#x2008; PUNCTUATION SPACE
    &#x2009; THIN SPACE
    &#x200A; HAIR SPACE
    &#x202F; NARROW NO-BREAK SPACE
    &#x205F; MEDIUM MATHEMATICAL SPACE
    &#x3000; IDEOGRAPHIC SPACE
    
    &#x10CB0; OLD HUNGARIAN CAPITAL LETTER EZS
    &#x10CF0; OLD HUNGARIAN SMALL LETTER EZS
    &#x16F36; MIAO LETTER ZSHA
    &#x16F3C; MIAO LETTER ZSA
    &#x16F3E; MIAO LETTER ZZSA
    &#x16F41; MIAO LETTER ZZSYA
    

    但是,使用Saxon 9.5进行测试表明最后6个字符无法识别:http://xsltransform.net/ncntCSo

相关问题