2012-12-05 62 views
2

我在某些條件下增加計數器時出現問題。xslt有條件增量

輸入:

<Users> 
    <User> 
    <id>1</id> 
    <username>jack</username> 
    </User> 
    <User> 
    <id>2</id> 
    <username>bob</username> 
    </User> 
    <User> 
    <id>3</id> 
    <username>bob</username> 
    </User> 
    <User> 
    <id>4</id> 
    <username>jack</username> 
    </User> 
</Users> 

求購輸出:

<Users> 
    <User> 
    <id>1</id> 
    <username>jack01</username> 
    </User> 
    <User> 
    <id>2</id> 
    <username>bob01</username> 
    </User> 
    <User> 
    <id>3</id> 
    <username>bob02</username> 
    </User> 
    <User> 
    <id>4</id> 
    <username>jack02</username> 
    </User> 
</Users> 

爲了實現這一點下面的算法可用於:通過用戶名

  • 爲每個用戶

    • 排序輸入
      • 當原有的用戶名是等於當前用戶名
        • 增量計數器和
        • 一套用戶名 '$用戶名$計數器'
      • 否則
        • 組計數器1
    • (再次按id排序 - 並非真的有必要)

    於是,我就變成XSLT這樣的:

    <xsl:stylesheet version="1.0" 
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
        <xsl:output method="xml" indent="yes" /> 
    
        <xsl:template match="Users"> 
        <Users> 
        <xsl:apply-templates select="create_user"> 
         <xsl:sort select="User/username"/> 
        </xsl:apply-templates> 
        </Users> 
        </xsl:template> 
    
        <xsl:template match="create_user"> 
        <id><xsl:value-of select="id"/></id> 
        <xsl:choose> 
         <xsl:when test="username=(preceding-sibling::User[1]//username)"> 
         <xsl:variable name="count"> 
          <xsl:number format="01"/> 
         </xsl:variable> 
         <username><xsl:value-of select="concat(username, $count)"/></username> 
         </xsl:when> 
         <xsl:otherwise> 
         <xsl:variable name="count"> 
          <xsl:number value="1" format="01"/> 
         </xsl:variable> 
         <username><xsl:value-of select="concat(username, $count)"/></username> 
         </xsl:otherwise> 
        </xsl:choose> 
        </xsl:template> 
    </xsl:stylesheet>  
    

    然而,通過執行這個,我得到以下錯誤:

    • 的用戶名不排序
    • 計數器不會增加
      • 而條件匹配計數器將成爲當前節點位置。
      • 在我們的例子id爲節點= 3將具有用戶名= bob03
    • 缺少標記

    有什麼想法?

  • +0

    我很困惑 - 「輸出」是指你正在得到什麼或你會*想要得到什麼? – ABach

    +0

    「輸出」確實指的是「通緝輸出」。 *編輯* – rednammoc

    回答

    5

    這種轉變

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    
    <xsl:template match="node()|@*"> 
        <xsl:copy> 
        <xsl:apply-templates select="node()|@*"/> 
        </xsl:copy> 
    </xsl:template> 
    
    <xsl:template match="username/text()"> 
        <xsl:value-of select="."/> 
        <xsl:value-of select= 
        "format-number(count(../../preceding-sibling::*[username=current()])+1, 
           '00') 
        "/> 
    </xsl:template> 
    </xsl:stylesheet> 
    

    時所提供的XML文檔應用:

    <Users> 
        <User> 
         <id>1</id> 
         <username>jack</username> 
        </User> 
        <User> 
         <id>2</id> 
         <username>bob</username> 
        </User> 
        <User> 
         <id>3</id> 
         <username>bob</username> 
        </User> 
        <User> 
         <id>4</id> 
         <username>jack</username> 
        </User> 
    </Users> 
    

    產生想要的,正確的結果

    <Users> 
        <User> 
         <id>1</id> 
         <username>jack01</username> 
        </User> 
        <User> 
         <id>2</id> 
         <username>bob01</username> 
        </User> 
        <User> 
         <id>3</id> 
         <username>bob02</username> 
        </User> 
        <User> 
         <id>4</id> 
         <username>jack02</username> 
        </User> 
    </Users> 
    
    +0

    輝煌的解決方案。 – xiaoyi

    +0

    @xiaoyi,不客氣。 –

    +0

    沒有排序?我印象深刻!感謝您的解決方案! – rednammoc

    0

    「增加計數器」不是你在函數式編程語言中所做的。您需要將輸入描述爲輸入的函數(如Dimitre所做的那樣),而不是描述計算輸出的過程或過程。