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

换句话说,我只想删除重复的元素,并将属于该部分的所有项目分组到该部分的元素中。

我已经尝试了很多方法,尽管有很多例子,但我找不到任何真正适合我的方法,我想避免再花两天时间为别人5分钟内就能解决的问题而挣扎。

非常感谢您的帮助。

Greg

Greg,

通过提供的示例链接,我成功地使用了以下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>

希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新