2012-08-02 109 views
1

我一直在寻找XSLT 1.0中Muenchian分组的示例,特别是此示例here。但是我无法使它在更复杂的XML结构上工作。在xslt 1.0中分组嵌套元素

我的XML目前看起来是这样的:

<?xml version="1.0" encoding="utf-8"?> 
<ContestResults> 
    <Contests> 
    <Contest sportId="35"> 
     <Sport>Beach Volleyball</Sport> 
     <Event>Men's</Event> 
     <Ranks> 
     <Rank position="1" eventId="1"> 
      <Athlete>Athlete 1a/Athlete 2a [GER]</Athlete> 
      <Result>2</Result> 
     </Rank> 
     <Rank position="2" eventId="1"> 
      <Athlete>Athlete 1b/Athlete 2b [NED]</Athlete> 
      <Result>0</Result> 
     </Rank> 
     </Ranks> 
    </Contest> 
    <Contest sportId="32"> 
     <Sport>Tennis</Sport> 
     <Event>Women's Singles</Event> 
     <Ranks> 
     <Rank position="1" eventId="2"> 
      <Athlete>Tennis Athlete 1</Athlete> 
      <Result>2</Result> 
     </Rank> 
     <Rank position="2" eventId="2"> 
      <Athlete>Tennis Athlete 2</Athlete> 
      <Result>1</Result> 
     </Rank> 
     </Ranks> 
    </Contest> 
    <Contest sportId="35"> 
     <Sport>Beach Volleyball</Sport> 
     <Event>Men's</Event> 
     <Ranks> 
     <Rank position="1" eventId="3"> 
      <Athlete>Athlete 3a/Athlete 4a [AUT]</Athlete> 
      <Result>2</Result> 
     </Rank> 
     <Rank position="2" eventId="3"> 
      <Athlete>Athlete 3b/Athlete 4b [SUI]</Athlete> 
      <Result>0</Result> 
     </Rank> 
     </Ranks> 
    </Contest> 
    </Contests> 
</ContestResults> 

但是我想组相同的队伍母公司下的排名节点时,它们具有相同的体育和活动。所以,我想要的结果看起来像这样:

<?xml version="1.0" encoding="utf-8"?> 
<ContestResults> 
    <Contests> 
    <Contest sportId="35"> 
     <Sport>Beach Volleyball</Sport> 
     <Event>Men's</Event> 
     <Ranks> 
     <Rank position="1" eventId="1"> 
      <Athlete>Athlete 1a/Athlete 2a [GER]</Athlete> 
      <Result>2</Result> 
     </Rank> 
     <Rank position="2" eventId="1"> 
      <Athlete>Athlete 1b/Athlete 2b [NED]</Athlete> 
      <Result>0</Result> 
     </Rank> 
     <Rank position="1" eventId="3"> 
      <Athlete>Athlete 3a/Athlete 4a [AUT]</Athlete> 
      <Result>2</Result> 
     </Rank> 
     <Rank position="2" eventId="3"> 
      <Athlete>Athlete 3b/Athlete 4b [SUI]</Athlete> 
      <Result>0</Result> 
     </Rank> 
     </Ranks> 
    </Contest> 
    <Contest sportId="32"> 
     <Sport>Tennis</Sport> 
     <Event>Women's Singles</Event> 
     <Ranks> 
     <Rank position="1" eventId="2"> 
      <Athlete>Tennis Athlete 1</Athlete> 
      <Result>2</Result> 
     </Rank> 
     <Rank position="2" eventId="2"> 
      <Athlete>Tennis Athlete 2</Athlete> 
      <Result>1</Result> 
     </Rank> 
     </Ranks> 
    </Contest> 
    </Contests> 
</ContestResults> 

我只是有点失去了如何做到这一点的唯一其他例子是在处理一个更简单的结构,我不知道是否有可能或我的钥匙和模板如何构建才能做到这一点。任何人都可以提供一些例子来说明如何实现?

任何意见,将不胜感激。

回答

0

这种转变

<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:key name="kContestById" match="Contest" use="@sportId"/> 

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

<xsl:template match="Contests"> 
     <Contests> 
     <xsl:apply-templates/> 
     </Contests> 
</xsl:template> 

<xsl:template match= 
    "Contest 
    [not(generate-id() 
    = 
    generate-id(key('kContestById', @sportId)[1])) 
    ]"/> 
<xsl:template match="Ranks"> 
    <Ranks> 
    <xsl:apply-templates select="key('kContestById', ../@sportId)/Ranks/Rank"/> 
    </Ranks> 
</xsl:template> 
</xsl:stylesheet> 

时所提供的XML文档应用:

<ContestResults> 
    <Contests> 
    <Contest sportId="35"> 
     <Sport>Beach Volleyball</Sport> 
     <Event>Men's</Event> 
     <Ranks> 
     <Rank position="1" eventId="1"> 
      <Athlete>Athlete 1a/Athlete 2a [GER]</Athlete> 
      <Result>2</Result> 
     </Rank> 
     <Rank position="2" eventId="1"> 
      <Athlete>Athlete 1b/Athlete 2b [NED]</Athlete> 
      <Result>0</Result> 
     </Rank> 
     </Ranks> 
    </Contest> 
    <Contest sportId="32"> 
     <Sport>Tennis</Sport> 
     <Event>Women's Singles</Event> 
     <Ranks> 
     <Rank position="1" eventId="2"> 
      <Athlete>Tennis Athlete 1</Athlete> 
      <Result>2</Result> 
     </Rank> 
     <Rank position="2" eventId="2"> 
      <Athlete>Tennis Athlete 2</Athlete> 
      <Result>1</Result> 
     </Rank> 
     </Ranks> 
    </Contest> 
    <Contest sportId="35"> 
     <Sport>Beach Volleyball</Sport> 
     <Event>Men's</Event> 
     <Ranks> 
     <Rank position="1" eventId="3"> 
      <Athlete>Athlete 3a/Athlete 4a [AUT]</Athlete> 
      <Result>2</Result> 
     </Rank> 
     <Rank position="2" eventId="3"> 
      <Athlete>Athlete 3b/Athlete 4b [SUI]</Athlete> 
      <Result>0</Result> 
     </Rank> 
     </Ranks> 
    </Contest> 
    </Contests> 
</ContestResults> 

产生想要的,正确的结果:

<ContestResults> 
    <Contests> 
     <Contest sportId="35"> 
     <Sport>Beach Volleyball</Sport> 
     <Event>Men's</Event> 
     <Ranks> 
      <Rank position="1" eventId="1"> 
       <Athlete>Athlete 1a/Athlete 2a [GER]</Athlete> 
       <Result>2</Result> 
      </Rank> 
      <Rank position="2" eventId="1"> 
       <Athlete>Athlete 1b/Athlete 2b [NED]</Athlete> 
       <Result>0</Result> 
      </Rank> 
      <Rank position="1" eventId="3"> 
       <Athlete>Athlete 3a/Athlete 4a [AUT]</Athlete> 
       <Result>2</Result> 
      </Rank> 
      <Rank position="2" eventId="3"> 
       <Athlete>Athlete 3b/Athlete 4b [SUI]</Athlete> 
       <Result>0</Result> 
      </Rank> 
     </Ranks> 
     </Contest> 
     <Contest sportId="32"> 
     <Sport>Tennis</Sport> 
     <Event>Women's Singles</Event> 
     <Ranks> 
      <Rank position="1" eventId="2"> 
       <Athlete>Tennis Athlete 1</Athlete> 
       <Result>2</Result> 
      </Rank> 
      <Rank position="2" eventId="2"> 
       <Athlete>Tennis Athlete 2</Athlete> 
       <Result>1</Result> 
      </Rank> 
     </Ranks> 
     </Contest> 
    </Contests> 
</ContestResults> 

说明

正确使用的Muenchian grouping method并重写identity rule

+0

感谢您的帮助。这很好,但我需要更新我的钥匙才能使用Sport AND Event,以确保我没有将错误的事件组合在一起,即concat(Sport,'+',Event) – pat007 2012-08-03 00:36:09

+0

@ pat007:不客气。至于不使用组合键进行分组,所提供的XML文档和想要的结果没有提示这将是必需的 - 如果它是这样的话 - 当然,这很容易实现。 – 2012-08-03 01:41:06