2013-02-20 76 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> 

希望它能幫助。