Xpath函数删除空格

时间:2009-12-05 16:07:32

标签: xml xslt xpath

我试图使用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">

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

同盟

2 个答案:

答案 0 :(得分:6)

正如蒂姆罗宾逊指出的那样,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结构一样。

答案 1 :(得分:3)

  

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

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

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

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