2013-04-29 58 views
1

使用XSLT 1.0,如何獲得最大數量的不同<info>元素,這些元素在像下面這樣的結構中(如果可能的話)是相同的<container>元素的子元素?每個節點的不同子元素的最大數量

<root> 
    <container> 
    <subelem sometimes_empty='yes'/> 
    <subelem> 
     <info>A</info> 
    </subelem> 
    <subelem> 
     <info>B</info> 
     <irrelevant>meh</irrelevant> 
    </subelem> 
    ... 
    </container> 
    <container> 
    <subelem> 
     <info>C</info> 
    </subelem> 
    <subelem> 
     <info>C</info> 
    </subelem> 
    ... 
    </container> 
    ... 
</root> 

使用提供here的不同分組的解決方案,我能得到不同的條目數量整體,但我每<container>節點這個數字,這將是下真正感興趣。我試圖應用函數count()和max()來達到這個目的,但是我對XSLT/XPath的有限經驗並沒有讓我成功地做到這一點。任何幫助將非常感激。

回答

2

使用XSLT 1.0,我如何獲得如下的結構的每個節點不同 元件的最大數以下的情況(在 所有可能的)?

這裏是如何找到想要的最大

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

<xsl:key name="kContInfo" match="info" use= 
    "concat(generate-id(ancestor::container[1]),'+',.)"/> 

<xsl:template match="/*"> 
    <xsl:for-each select="container"> 
    <xsl:sort data-type="number" order="descending" select= 
    "count(*/info[generate-id() 
       =generate-id(key('kContInfo', 
            concat(generate-id(ancestor::container[1]), 
             '+',.) 
           ) 
          )])"/> 
    <xsl:if test="position() = 1"> 
     <xsl:value-of select= 
    "count(*/info[generate-id() 
       =generate-id(key('kContInfo', 
            concat(generate-id(ancestor::container[1]), 
             '+',.) 
           ) 
          )])"/> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

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

<root> 
    <container> 
    <subelem sometimes_empty='yes'/> 
    <subelem> 
     <info>A</info> 
    </subelem> 
    <subelem> 
     <info>B</info> 
     <irrelevant>meh</irrelevant> 
    </subelem> 
    ... 
    </container> 
    <container> 
    <subelem> 
     <info>C</info> 
    </subelem> 
    <subelem> 
     <info>C</info> 
    </subelem> 
    ... 
    </container> 
    ... 
</root> 

想要的,正確的結果生產:

2 
+0

我沒有意識到max()只是XSLT 2.0。我想這解釋了我得到的一些錯誤......感謝這種排序技巧。 – Dologan 2013-04-30 09:45:53

+0

@Dologan,不客氣。 – 2013-04-30 14:30:24

1

您引用的鏈接是正確的方向。在這種情況下,你只需要一個這樣的組合鍵:

<xsl:key 
    name="kInfoByContainer" 
    match="info" 
    use="concat(generate-id(../../container), '+', .)" /> 

要確認,當這種XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output omit-xml-declaration="no" indent="yes" method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key 
    name="kInfoByContainer" 
    match="info" 
    use="concat(generate-id(../../container), '+', .)"/> 

    <xsl:template match="container"> 
    Container <xsl:value-of select="position()"/> has unique info elements: 
    <xsl:value-of 
     select="count(*/info[generate-id() = 
          generate-id(key(
          'kInfoByContainer', 
           concat(generate-id(../../container), '+', .) 
          )[1])])"/> 

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

......是對所提供的XML應用:

<root> 
    <container> 
    <subelem sometimes_empty="yes"/> 
    <subelem> 
     <info>A</info> 
    </subelem> 
    <subelem> 
     <info>B</info> 
     <irrelevant>meh</irrelevant> 
    </subelem> 
    </container> 
    <container> 
    <subelem> 
     <info>C</info> 
    </subelem> 
    <subelem> 
     <info>C</info> 
    </subelem> 
    </container> 
</root> 

......想要的結果產生:

Container 1 has unique info elements: 
2 
Container 2 has unique info elements: 
1 
+0

謝謝。我認爲複合鍵可能有幫助,但我不知道如何成功應用它們。 – Dologan 2013-04-30 09:38:31

相關問題