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 删除所有属性的前导和尾随空格的主要内容,如果未能解决你的问题,请参考以下文章