我试图使用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)
我不确定差异或何时应该使用.任何帮助深表感谢.
盟友
正如蒂姆罗宾逊指出的那样,translate将会有所作为.(我不会称之为"黑客攻击",但后来我一直处于与XSLT关系中与我的折磨者共处的阶段.)如果你使用这样的东西,你的代码将更具可读性:
<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/>
<xsl:variable name="ws" value=" 	"/>
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构造那样做同样的事情.