2011-03-22 102 views
4

我一直在尋找,但找不到相當於「normalize-space」的字符的XSL函數。也就是說,我的內容具有重音UNICODE字符,這很好,但是從內容來看,我創建了一個文件名,我不想要那些重音。如何從XSL中的字符中去除重音符號?

那麼,有沒有什麼我可以忽略,或不正確地使用谷歌搜索,輕鬆處理字符?

在XML數據:

<filename>gri_gonéwiththèw00mitc</filename> 

在XSLT樣式表:

<xsl:variable name="file"> 
    <xsl:value-of select="filename"/> 
</xsl:variable> 

<xsl:value-of select="$file"/> 

結果 「gri_gonéwiththèw00mitc」

其中

<xsl:value-of select='replace(normalize-unicode("$file", "NFKD"), "[^\\p{ASCII}]", "")'/> 

結果一無所獲。

什麼我的目標是gri_gonewiththew00mitc

我使用的語法錯誤(沒有口音)?

+0

刪除重音只適用於一小部分的Unicode字符。據我所知,沒有標準的拉丁化字符轉錄方式。 (也就是說,每種語言都有一個不同的)。 – biziclop 2011-03-22 21:50:44

+0

請檢查我的答案是否有正確的RegExp語法。 – 2011-03-24 02:59:47

回答

6

在XSLT/XPath 1.0中,如果您想用不含重音的對應部分替換那些重音字符,則可以使用translate()函數。

但是,假設你的「重音UNICODE字符」不是由unicode字符組成的。如果是這種情況,您需要使用XPath 2.0 normalize-unicode()函數。

而且,如果真正的目標是有一個有效的URI,你應該使用encode-for-uri()

更新:例子

translate('gri_gonéwiththèw00mitc','áàâäéèêëíìîïóòôöúùûü','aaaaeeeeiiiioooouuuu') 

結果:gri_gonewiththew00mitc

encode-for-uri('gri_gonéwiththèw00mitc') 

結果:gri_gon%C3%A9withth%C3%A8w00mitc

正確表達提供建議由@biziclop:

replace(normalize-unicode('gri_gonéwiththèw00mitc','NFKD'),'\P{ASCII}','') 

結果:gri_gonewiththew00mitc

注意:在XPath 2.0,正確的字符類的否定是大寫的\P

+0

'translate()'假定你列出了你想要替換的所有字符。我的猜測是OP想要避免這種情況。儘管我不認爲這是可能的。 – biziclop 2011-03-22 21:59:56

+0

@biziclop:我的答案只有一個鏈接到'encode-for-uri()'函數是有原因的。 – 2011-03-22 22:07:55

+0

@Alejandro第二個想法是,如果將字符串規範化爲NFKD形式,然後丟棄每個非基本ASCII(0-127)字符(可以使用正則表達式替換),您將得到一個不帶重音的字符串。 – biziclop 2011-03-22 22:38:46

3

所以,違背了我的意見,你可以試試這個:

replace(normalize-unicode("öt hűtőházból kértünk színhúst", "NFKD"), "[^\\p{ASCII}]", "") 

雖然被警告,不能被分解,沒有基本的ASCII任何字符(挪威ø或冰島Þ爲例)將完全從字符串中刪除,但這可能與您的要求相符。

+0

很好的例子。請檢查我的更新是否有正確的RegExp字符類否定語法。 – 2011-03-24 02:59:01

1

先前建議的方式包含未知的名爲'ASCII'的字符類。根據我的經驗,XPath 2.0可以識別類BasicLatin,它的用途與'ASCII'相同。

replace(normalize-unicode('Lliç d'Am Oükl Úkřeč', 'NFKD'), '\P{IsBasicLatin}', '') 
相關問題