XSLT 删除所有属性的前导和尾随空格

Posted

技术标签:

【中文标题】XSLT 删除所有属性的前导和尾随空格【英文标题】:XSLT Remove leading and trailing whitespace of all attributes 【发布时间】:2013-05-10 12:10:04 【问题描述】:

如何创建相同的 XML 表单,但删除每个属性的前导和尾随空格? (使用 XSLT 2.0)

从这里开始:

<node id="DSN ">
    <event id=" 2190 ">
        <attribute key=" Teardown"/>
        <attribute key="Resource "/>
    </event>
</node>

到这里:

<node id="DSN">
    <event id="2190">
        <attribute key="Teardown"/>
        <attribute key="Resource"/>
    </event>
</node>

我想我更喜欢使用normalize-space() 函数,但不管怎样都行。

【问题讨论】:

smaccoun,请注意,当前接受的答案是错误的。它所做的比要求的要多,不仅删除了前导和尾随空格,而且还将任何封闭的空格减少到只有一个空格。 @Gunther 提供了一个很好的 XSLT 2.0 解决方案,这正是这个问题想要的。我建议接受正确的答案。 好。真相总是在最后获胜:) 是的,很抱歉迟到了 :) 我只是把 normalize-space() 偏好放在那里,因为我怀疑这是必要的。事后看来,这可能不值得,所以我要把它从问题中删除。 @smaccoon,新年快乐! 【参考方案1】:

normalize-space() 不仅会删除前导和尾随空格,还会安装一个空格字符来代替任何连续的空格字符序列。

正则表达式可用于处理前导和尾随空格:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

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

  <xsl:template match="@*">
    <xsl:attribute name="local-name()" namespace="namespace-uri()">
      <xsl:value-of select="replace(., '^\s+|\s+$', '')"/>
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

【讨论】:

【参考方案2】:

应该这样做:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="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:stylesheet>

这也兼容 XSLT 1.0。

在您的示例输入上运行时,结果是:

<node id="DSN">
  <event id="2190">
    <attribute key="Teardown" />
    <attribute key="Resource" />
  </event>
</node>

这里要注意的一点是normalize-space() 会将属性值中的任何空格转换为单个空格,因此:

<element attr="   this    is an
                   attribute   " />

会改成这样:

<element attr="this is an attribute" />

如果您需要按原样在值内保留空格,请参阅 Gunther 的回答。

【讨论】:

-1 表示错误答案。问题是删除前导和尾随空格 - 而不是将封闭的空格规范化为每个空格。 JLRishe,这与问题的明确目标相矛盾——很可能 OP 不知道 normalize-space() 做了什么。 @JLRishe:是的,这似乎是合理的,但是如果它们“同样合理”,那么通过告知 OP 您的解决方案的行为与问题标题有何不同,您将处于更安全的基础上;换句话说,通过记录您对 OP 意图的假设。 @JLRishe,如果提问者满足于使用normalize-space(),他就不会问这个问题。 @LarsH 点数。我添加了免责声明。

以上是关于XSLT 删除所有属性的前导和尾随空格的主要内容,如果未能解决你的问题,请参考以下文章

如何取回使用 .trim 删除的所有原始前导和尾随空格? [复制]

从字符串值中删除空格(前导和尾随)

前导和尾随空格剪切 + 中间空格替换

删除 JSON 键中的前导和尾随空格

如何删除前导和尾随的空格以及字符串中的多个空格? [复制]

如何在Java中仅删除字符串的尾随空格并保留前导空格?