0

This might seem like a simple question to some, but to me it's been a nightmore for a few days now.

I would like to change this 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>

to this:

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

In other words I simply want to remove the repeated elements and group all items belonging to that part within the part's element.

I've tried via many ways and although there are many examples, I was unable to find anything that really works for me and I'd like to avoid spending another 2 days struggling with something that somebody else will solve in 5 minutes.

Help is much appreciated.

Greg

Greg Fullard
  • 126
  • 2

1 Answers1

0

Greg,

With the link to the example provide I managed to get this working with the following 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>

Hope it helps.

Mark Veenstra
  • 4,691
  • 6
  • 35
  • 66