2013-04-15 40 views
0

我希望將第一個字母大寫的標題更改爲正確的標題大小寫,即文章,連詞和選擇介詞都是小寫。最初我希望使用「停用詞」列表的xml文檔來實現這一點,但最接近我已成功通過分析字符串的正則表達式。問題是,作爲xslt的一個新手,我不知道如果沒有循環無限期地遞歸它。此外,理想情況下,這將是一個功能,而不是一個模板。我感謝那裏的專家提供的任何幫助。使用xsl:analyze-string來更改可能重複的多個單詞

輸入:

<element> 
    <title>The String Is In First Letter Caps And May Have A Word Or Words Such As A, An, Or The And And, But, For, As, At, In, Or When.</title> 
</element> 

XSLT:

<xsl:template name="proper-case" match="/element/title"> 
<xsl:param name="title" select="."/> 
    <xsl:analyze-string select="$title" regex="\WA\W|\WAn\W|\WThe\W|\WAnd\W|\WBut\W|\WFor\W|\WNor\W|\WOr\W|\WFSo\W|\WYet\W|\WAs\W|\WAt\W|\WBy\W|\WIf\W|\WIn\W|\WOf\W|\WOn\W|\WTo\W|\WWith\W" flags="i"> 
    <xsl:matching-substring> 
     <xsl:value-of select="lower-case(.)"/>        
    </xsl:matching-substring> 
    <xsl:non-matching-substring> 
     <xsl:value-of select="."/>    
    </xsl:non-matching-substring> 
    </xsl:analyze-string> 
</xsl:template> 

電流輸出:

<element> 
    <title>The String Is in First Letter Caps and May Have a Word or Words Such as A, an, or The and And, but, for, as, at, in, or When.</title> 
</element> 

所需的輸出:

<element> 
    <title>The String Is in First Letter Caps and May Have a Word or Words Such as a, an, or the and and, but, for, as, at, in, or when.</title> 
</element> 
+0

您使用哪種XSLT 2.0處理器?你爲什麼認爲你需要遞歸?它看起來像'\ b'的字邊界而不是'\ W'可以幫助。我認爲XSLT/XPath正則表達式語言的規範不支持'\ b',但我認爲撒克遜可以通過使用'flags =「!i」'來支持它。 –

+0

@Martin Honnen:我正在使用oXygen和Saxon-PE 9.4.0.6。我以爲我需要遞歸,因爲不是所有處理「停止詞」的實例。我的背景是xhtml和css,而不是編程,所以xslt/xpath是我的新領域。謝謝。 – aglerum

回答

1

我認爲更好的選擇是使用序列作爲「停用詞」列表。

例..

XML輸入

<element> 
    <title>The String Is In First Letter Caps And May Have A Word Or Words Such As A, An, Or The And And, But, For, As, At, In, Or When.</title> 
</element> 

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!--Sequence of lower case words.--> 
    <xsl:param name="lcw" select="('A','An','The','And','But','For','Nor','Or', 
     'So','Yet','As','At','By','If','In','Of','On','To','With','When')"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="title"> 
     <xsl:copy> 
      <xsl:analyze-string select="." regex="\w+"> 
       <xsl:matching-substring> 
        <xsl:choose> 
         <xsl:when test=".=$lcw and not(position()=1)"> 
          <xsl:value-of select="lower-case(.)"/> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:value-of select="."/> 
         </xsl:otherwise> 
        </xsl:choose> 
       </xsl:matching-substring> 
       <xsl:non-matching-substring> 
        <xsl:value-of select="."/> 
       </xsl:non-matching-substring> 
      </xsl:analyze-string>   
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML輸出

<element> 
    <title>The String Is in First Letter Caps and May Have a Word or Words Such as a, an, or the and and, but, for, as, at, in, or when.</title> 
</element> 
+0

非常感謝你建議使用列表的順序。這是我以前從未見過的。我給該模板命名,刪除了'',並能夠在主模板中成功調用該模板。 – aglerum