2013-02-20 78 views
0

对于某些人来说,这可能看起来像是一个简单的问题,但对我来说这已经是几天以来的一个夜晚了。使用XSLT v1对XML元素进行分组

我想改变这个XML:

<?xml version="1.0" encoding="UTF-8"?> 
<questionnaire> 
    <Id>questionnaireId</Id> 
    <Desc>questionnnaireDesc here</Desc> 
    <QuestParts> 
    <part> 
     <partNumber>1</partNumber> 
     <questItems> 
     <item> 
       <itemId>1</itemId> 
       <itemText>The first item</itemText> 
     </item> 
     </questItems> 
    </part> 
    <part> 
     <partNumber>1</partNumber> 
     <questItems> 
     <item> 
       <itemId>2</itemId> 
       <itemText>The second item</itemText> 
     </item> 
     </questItems> 
    </part> 
    <part> 
     <partNumber>2</partNumber> 
     <questItems> 
     <item> 
       <itemId>3</itemId> 
       <itemText>A third item, but inside part 2</itemText> 
     </item> 
     </questItems> 
    </part> 
    <part> 
     <partNumber>2</partNumber> 
     <questItems> 
     <item> 
       <itemId>4</itemId> 
       <itemText>A fourth item, but inside part 2</itemText> 
     </item> 
     </questItems> 
    </part> 
    </QuestParts> 
</questionnaire> 

这样:

<questionnaire> 
    <Id>questionnaireId</Id> 
    <Desc>questionnnaireDesc here</Desc> 
    <QuestParts> 
    <part> 
     <partNumber>1</partNumber> 
     <questItems> 
     <item> 
       <itemId>1</itemId> 
       <itemText>The first item</itemText> 
     </item> 
     <item> 
       <itemId>2</itemId> 
       <itemText>The second item</itemText> 
     </item> 
     </questItems> 
    </part> 
    <part> 
     <partNumber>2</partNumber> 
     <questItems> 
     <item> 
       <itemId>3</itemId> 
       <itemText>A third item, but inside part 2</itemText> 
     </item> 
     <item> 
       <itemId>4</itemId> 
       <itemText>A fourth item, but inside part 2</itemText> 
     </item> 
     </questItems> 
    </part> 
    </QuestParts> 
</questionnaire> 

换句话说,我只是想删除重复的元素和组属于内的那部分的所有项目部分的元素。

我已经尝试了很多方法,虽然有很多例子,但我找不到任何真正适合我的东西,而且我想避免花费另外2天的时间来解决其他人会在5中解决的问题分钟。

非常感谢帮助。

格雷格

+0

也许这是有帮助的:http://stackoverflow.com/questions/5142546/grouping-in-xslt-1-0?rq=1 – 2013-02-20 16:02:52

回答

0

格雷格,

与链接到例如提供我设法用下面的XSLT这方面的工作:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:key name="partnr" match="part" use="partNumber" /> 

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

    <xsl:template match="QuestParts"> 
     <QuestParts> 
      <xsl:for-each select="part[generate-id(.)=generate-id(key('partnr',partNumber))]"> 
       <xsl:variable name="curpartnr" select="partNumber" /> 
       <partNumber><xsl:value-of select="$curpartnr" /></partNumber> 

       <questItems> 
        <xsl:for-each select="../part[generate-id(.)=generate-id(key('partnr',partNumber))]/questItems/item"> 
         <item> 
           <itemId><xsl:value-of select="itemId" /></itemId> 
           <itemText><xsl:value-of select="itemText" /></itemText> 
         </item> 
        </xsl:for-each> 
       </questItems> 
      </xsl:for-each> 
     </QuestParts> 
    </xsl:template> 
</xsl:stylesheet> 

希望它能帮助。