2013-02-13 53 views
1

我需要從以下字符串拉出的最後一個字的使用姓氏:XSLT 1.0版本需要拔出串的最後一個字

<CUSTOMER_x0020_NAME>Mr Tim Cookson</CUSTOMER_x0020_NAME> 

所以我只需要拉出「庫克森'使用XSLT,我該怎麼做?嘗試了幾次關係後,但沒有運氣。

回答

0

您可以使用此遞歸模板得到一個值的最後一個字:

<xsl:template name="GetLastWord"> 
    <xsl:param name="value" /> 
    <xsl:variable name="normalized" select="normalize-space($value)" /> 

    <xsl:choose> 
     <xsl:when test="contains($normalized, ' ')"> 
     <xsl:call-template name="GetLastWord"> 
      <xsl:with-param name="value" select="substring-after($normalized, ' ')" /> 
     </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="$normalized"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

你將這個模板添加到您的XSLT,然後簡單地調用它,就像這樣:

<xsl:call-template name="GetLastWord"> 
    <xsl:with-param name="value" select="CUSTOMER_x0020_NAME" /> 
    </xsl:call-template> 
+0

謝謝,這偉大工程。舉個例子,如果我剛剛拿出蒂姆庫克森先生的'蒂姆',那怎麼樣? – user2069189 2013-02-14 10:09:10

+0

這種情況下選擇「Tim」的標準是什麼?第一個空格之後的第一個單詞? – JLRishe 2013-02-14 10:15:49

2

這是一個非遞歸解決方案,它與任何非字母字符(但最後一個單詞後的字符,如果有的話,應該只有空格)的字分隔符一起工作:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pLower" select= 
    "'abcdefghijklmnopqrstuvwxyz'"/> 

<xsl:param name="pUpper" select= 
    "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 

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

<xsl:template match="text()"> 
    <xsl:variable name="vText" select="normalize-space()"/> 
    <xsl:variable name="vLength" select="string-length($vText)"/> 
    <xsl:variable name="vPunct" select="translate(., $vAlpha, '')"/> 

    <xsl:for-each select= 
     "document('')//node() 
     |document('')//@* 
     |document('')//namespace::*"> 
    <xsl:variable name="vPos" select="position()"/> 
    <xsl:variable name="vRemaining" 
       select="substring($vText, $vPos)"/> 

    <xsl:if test= 
    "contains($vPunct, substring($vRemaining,1,1)) 
    and 
    $vLength -$vPos 
     = string-length(translate($vRemaining, $vPunct, '')) 
    "> 
    <xsl:value-of select="substring($vRemaining,2)"/> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

當這個變換所提供的XML文檔應用:

<CUSTOMER_x0020_NAME>Mr Tim Cookson</CUSTOMER_x0020_NAME> 

有用,正確的結果產生:

Cookson 

當相同的變換被應用上此XML文件

<CUSTOMER_x0020_NAME>Mr. Tim Berners-Lee</CUSTOMER_x0020_NAME> 

再次正確的結果產生:

Lee 
+1

非常好。迪米特雷,你的狡猾和聰明才智永遠不會激勵我。 (那些喜歡我的人試圖更好地理解這個解決方案中的黑魔法是如何工作的,可能會發現自問自己將最後一個符號開始超過82個字符的字符串發生到字符串的空間規範化形式中會發生什麼,並且問自己爲什麼會發生這種情況,以及如何使它成爲82以外的數字。) – 2013-02-14 17:36:14

+0

@ CMSperberg-McQueen,這個問題的答案在我寫於10年前的一篇文章中:'' - 這包含足夠的節點來開始:) – 2013-02-14 19:11:09

相關問題