正如蒂姆羅賓遜指出,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構造一樣。
只需澄清一點,normalize-space()將在字符串中間刪除重複的空白字符(空格,製表符和/或回車符),並將它們轉換爲單個空格。 – 2009-12-05 18:36:23