我试图使用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">
我不确定差异或何时应该使用。非常感谢任何帮助。
同盟
答案 0 :(得分:6)
正如蒂姆罗宾逊指出的那样,translate
将会成功。 (我不会称之为“黑客攻击”,但后来我一直处于与XSLT关系中与我的折磨者共处的阶段。)如果你使用这样的东西,你的代码将更具可读性:
<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/>
<xsl:variable name="ws" value=" 	"/>
...这是我在大多数变换的顶部包含的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(' ', '')
去除空格,换行符和回车符。如果您使用.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"/>
。