【问题标题】:Xpath function to remove white spaceXpath 函数去除空格
【发布时间】:2010-12-23 13:55:20
【问题描述】:

我试图使用 XSL 和 Xpath 函数从名为 name 的 XML 属性中删除所有空格并将其设为小写。目前我有类似的东西

 <xsl:variable name="linkName">
 <xsl:value-of select="normalize-space(name)"/>
 </xsl:variable>

这会删除开头和结尾的空白,但不会删除中间的空白。有什么建议吗?

处理和更改 XML 数据的最佳实践是什么,因为您似乎可以使用

<xsl:value-of select="x"/>  

直接放在 HTML 中

<xsl:attribute name="y">
<xsl:value-of select="x"/>

或使用

<xsl:variable name="x">

我不太确定这些差异或何时应该使用它们。非常感谢任何帮助。

盟友

【问题讨论】:

  • 澄清一点, normalize-space() 将删除字符串中间的重复空白字符(空格、制表符和/或回车)并将它们转换为单个空格。

标签: xml xslt xpath


【解决方案1】:

正如 Tim Robinson 所指出的,translate 可以解决问题。 (我不会称它为“黑客”,但我长期以来一直处于与 XSLT 的关系中识别我的施虐者的阶段。)如果您使用类似这样的东西,您的代码将更具可读性:

<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/>
<xsl:variable name="ws" value=" &#13;&#10;&#09"/>

...这是globals.xslt 文件的一部分,我包含在我编写的大多数转换的顶部。那么这个:

<xsl:value-of select="translate(x, concat($uc, $ws), $lc)"/>

将每个大写字母转换为对应的小写字母,并将每个空白字符转换为空。

通常您使用xsl:variable 的原因是为了使代码更具可读性(如上例所示),或者存储无法有效计算的中间结果。第四种将数据输入输出的方法是您没有提到的方法,它非常有用:属性值模板。所有这些都做同样的事情:

<link>
   <xsl:attribute name="name">
      <xsl:value-of select="translate(name, concat($uc, $ws), $lc)"/>
   </xsl:attribute>
</link>

<link>
    <xsl:attribute name="name" value="translate(name, concat($uc, $ws), $lc)"/>
</link>

<xsl:variable name="linkName" value="translate(name, concat($uc, $ws), $lc)"/>
<link name="{$linkName}"/>

在这种特殊情况下,后两者中哪一个更简单、更清晰是有争议的。但大多数情况下并非如此:将值的计算与它们插入输出的方式分开会使两者更容易理解,就像使用 AVT 而不是执行相同操作的更冗长的 XSLT 构造一样。

【讨论】:

    【解决方案2】:

    这会删除开头和结尾的空白,但不会删除中间的空白。有什么建议吗?

    您可以使用translate(' &amp;#13;&amp;#10;', '') 去除空格、换行符和回车符。如果您使用 .NET 类或 MSXSL 进行转换,那么将字符转换为小写有点困难。我使用的一种技巧是使用transform 将大写字母转换为小写字母;另一种是编写一个.NET 扩展对象来提供lower-case 函数。 lower-case 函数内置在 XPath/XSL 2.0 中。

    在你问题的第二部分,他们做了不同的事情:

    • &lt;xsl:value-of ... 直接在 HTML 中放置一个值
    • &lt;xsl:attribute ... 在当前 HTML 元素上创建一个属性并为其赋值
    • &lt;xsl:variable ... 声明一个 XSL 变量而不影响 HTML。您可以使用 &lt;xsl:value-of select="$x"/&gt; 将此变量写入 HTML。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多