如何用一个 space 替换双 spaces,用一个 space 替换表格并用 XSL 删除 \n 和 \r

How to replace double spaces by one space, tabulations by one space and delete \n and \r with XSL

我是法国人,对正字法很抱歉... 我从来没有做过一些 XSL 我有一个我不知道在输入中的 XML,我尝试用 space 替换双 space,用一个 space 替换表格,并用 XSL 删除 \n 和 \r

我在 Internet 上看到 normalize-space() 或翻译,但我不确定这是解决方案...

你能帮帮我吗?

谢谢

XML 文件的示例可以是:

  <?xml version="1.0" encoding="UTF-8"?>
  <input>
       something   with       
 a   lot   of    space and new lines
  </input>
  <input2>
      <subInput2>
       something   with       
 a   lot   of    space and new lines
      </subInput2>
  </input2>

是的,normalize-space() 是要走的路。它在所有版本的 xslt 中都有效。有关详细信息,请参阅 http://www.w3schools.com/xsl/xsl_functions.asp

我真的应该补充一点,在 xml 中,额外的白色 space 会以与在 html 中相同的方式被忽略,除非您明确地将选项设置为 。所以我会说 - 根据经验 - 你并不总是需要在任何你看到额外 space.

的地方使用 normalize-space()

示例:

输入:

  <?xml version="1.0" encoding="UTF-8"?>
  <input>

       something   with       
 a   lot   of    space and new lines

  </input>

非常简单的 xsl:

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

结果:

 <result>something with a lot of space</result>

要标准化整个 XML 文档的所有文本节点中的空格,请执行:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

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

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

</xsl:stylesheet>

请注意,这不会影响属性中的文本。如果你也想处理这些,请执行:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

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

<xsl:template match="@*">
    <xsl:attribute name="{name()}">
        <xsl:value-of select="normalize-space()"/>
    </xsl:attribute>
</xsl:template>

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

</xsl:stylesheet>