2011-12-05 53 views
5

......應該是所有字母或正則表達式[A-Z]。如何將xslt與正則表達式結合起來?如果元素包含字母,如何編寫xslt?

<xsl:if test="string-contains(//ns0:elem/value, 'sth')"> 


     </xsl:if> 
+0

@_marko:你看過我的回答,對你有用嗎? –

+0

我剛剛用第二個XPath表達式和完整的代碼示例更新了答案,它演示了這兩個XPath 1.0表達式 - 第一個使用* double-translate *方法。 –

回答

9

XPath/XSLT 1.0不支持正則表達式,但可以使用基本字符串函數執行簡單驗證。

白名單

中的XPath 1.0 translate函數可以用於模擬一個白名單:

<xsl:variable name="alpha" 
       select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
<xsl:if test="string-length(translate(., $alpha, '')) &gt; 0"> 
    <!-- context node contains non-alpha characters --> 
</xsl:if> 

該測試使用translate首先去除所有大寫和小寫字母。如果結果字符串的長度不爲零,則原始字符串必須包含其他字符。

注意,上面的表達式可以簡化爲:

<xsl:if test="translate(., $alpha, '')"> 

...因爲任何非空字符串計算爲真。

黑名單

使用雙translate方法來治療$alpha作爲黑名單:

<xsl:if test="translate(., translate(., $alpha, ''), '')"> 
    <!-- context-node contains characters on the blacklist (in $alpha) --> 
</xsl:if> 

translate返回字符串與所有字母字符移除,然後將其用作模板調用第二個translate,導致只包含字母字符的字符串。如果這個字符串不是零,那麼我們在黑名單上找到一個字符。這是一個經典的方法。見,例如,這個先前的問題上SO:字符串的長度刪除所有後

not(string-length(translate(., $alpha, ''))=string-length()) 

如果:

黑名單測試也可以這樣進行的黑名單字符的長度不等於原始字符串的長度,則字符串必須在黑名單中包含一個字符。

摘要

黑名單和白名單實際上是同一枚硬幣的兩面。下面一起演示它們的用法:

<xsl:if test="translate(., $alpha, '')"> 
    [contains some characters not on the list] 
</xsl:if> 
<xsl:if test="not(translate(., $alpha, ''))"> 
    [contains only characters on the list] 
</xsl:if> 
<xsl:if test="translate(., translate(., $alpha, ''), '')"> 
    [contains some characters on the list] 
</xsl:if> 
<xsl:if test="not(translate(., translate(., $alpha, ''), ''))"> 
    [contains only characters not on the list] 
</xsl:if> 
2

在XPath 1.0(含XSLT 1.0作品),你不必對正則表達式的工具(你只需要像containsstarts-with功能,見下面的鏈接瞭解更多信息)

在XPath 2.0(適用於XSLT 2.0),您可以獲得matches函數和replace函數(請參閱下面的鏈接)。

網址看到:

的XPath 1.0字符串函數:http://www.w3.org/TR/xpath/#section-String-Functions

的XPath 2.0的正則表達式的功能:http://www.w3.org/TR/xpath-functions/#string.match

+1

我有一個解決方案,並使用1.0版。如果在xslt中不能使用正則表達式,如何搜索字符串中的字母? – marko

2

如何搜索字母串,如果你不能在使用正則表達式XSLT?

好問題,+1。

使用

translate(., translate(., $vAlpha, ''), '') 

這將產生在當前節點的字符串值中的所有字符,即$vAlpha

如果你想看看給定字符串$str只包含字母而不包含其他字符,請使用

string-length(translate($str, $vAlpha, '')) = 0 

完善的代碼示例

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:variable name="vUpper" select= 
    "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 

<xsl:variable name="vLower" select= 
    "'abcdefghijklmnopqrstuvwxyz'"/> 

<xsl:variable name="vAlpha" select= 
     "concat($vUpper, $vLower)"/> 

<xsl:variable name="vStr" select="'A12B_..c02d'"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "translate($vStr, 
       translate($vStr, $vAlpha, ''), '') 
    "/> 


    The string <xsl:value-of select="$vStr"/> has <xsl:text/> 
    <xsl:value-of select= 
    "string-length(translate($vStr, $vAlpha, ''))"/> <xsl:text/> 
    non-letters 

</xsl:template> 
</xsl:stylesheet> 

當這種轉化是在任何XML文檔(未使用)施加,有用,正確的結果產生

ABcd 


    The string A12B_..c02d has 7 
    non-letters 

還記得:第一個XPath表達式上面演示了所謂的「雙翻譯方法」,由邁克爾凱首次提出。

相關問題