Xpath函数删除空格

all*_*gan 7 xml xslt xpath

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

 <xsl:variable name="linkName">
 <xsl:value-of select="normalize-space(name)"/>
 </xsl:variable>
Run Code Online (Sandbox Code Playgroud)

这将删除开头和结尾但不是中间的空白区域.有什么建议?

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

<xsl:value-of select="x"/>  
Run Code Online (Sandbox Code Playgroud)

直接放在HTML中

要么

<xsl:attribute name="y">
<xsl:value-of select="x"/>
Run Code Online (Sandbox Code Playgroud)

或使用

<xsl:variable name="x">
Run Code Online (Sandbox Code Playgroud)

我不确定差异或何时应该使用.任何帮助深表感谢.

盟友

Rob*_*ney 6

正如蒂姆罗宾逊指出的那样,translate将会有所作为.(我不会称之为"黑客攻击",但后来我一直处于与XSLT关系中与我的折磨者共处的阶段.)如果你使用这样的东西,你的代码将更具可读性:

<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/>
<xsl:variable name="ws" value=" &#13;&#10;&#09"/>
Run Code Online (Sandbox Code Playgroud)

...这是globals.xslt我在大多数变换的顶部包含的文件的一部分.然后这个:

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

将每个大写字母翻译成小写的等价字母,并将每个空格字符翻译成空白字符.

通常,您使用的原因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}"/>
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,可以说最后两个中的哪一个更简单,更清晰.但大多数时候,它并不是:将值的计算与它们插入到输出中的方式分开使得两者都更容易理解,就像使用AVT而不是更冗长的XSLT构造那样做同样的事情.