如何用一个空格替换双空格,用一个空格制表,用XSL删除\ n和\ r \ n

时间:2016-06-19 14:24:41

标签: xml xslt spaces

我是法国人,对于拼写错误对不起... 我从未做过一些XSL 我有一个我不知道输入的XML,我尝试用空格替换双空格,用一个空格制表,用XSL删除\ n和\ r \ n

我在互联网上看到了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>

2 个答案:

答案 0 :(得分:1)

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

我真的应该在xml中添加额外的空格,除非你明确地将选项设置为&lt; xsl:preserve-space&gt;,否则将以与html相同的方式忽略额外的空格。所以我会说 - 作为一个经验法则 - 你并不总是需要在看到额外空间的地方使用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>

答案 1 :(得分:1)

要规范化整个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>