每个节点的不同子元素的最大数量

问题描述:

使用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的有限经验并没有让我成功地做到这一点。任何帮助将非常感激。

使用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

您引用的链接是正确的方向。在这种情况下,你只需要一个这样的组合键:

<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