【问题标题】:XSLT Remove leading and trailing whitespace of all attributesXSLT 删除所有属性的前导和尾随空格
【发布时间】: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,新年快乐!

标签: xml xslt xslt-2.0


【解决方案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 点数。我添加了免责声明。
    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 2018-10-04
    • 1970-01-01
    • 2020-08-20
    • 2013-07-20
    • 2019-07-03
    • 1970-01-01
    • 2017-03-16
    相关资源
    最近更新 更多