2009-12-05 134 views
7

我試圖使用XSL和Xpath函數從稱爲名稱的XML屬性中刪除所有空白,並使其小寫。目前,我有類似的東西Xpath函數刪除空白空間

<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"> 

我並不確定這些差異或每個應該使用的時間。任何幫助深表感謝。

盟友

+1

只需澄清一點,normalize-space()將在字符串中間刪除重複的空白字符(空格,製表符和/或回車符),並將它們轉換爲單個空格。 – 2009-12-05 18:36:23

回答

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構造一樣。

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。