0

これは、一部の人にとっては簡単な質問のように思えるかもしれませんが、私にとっては、ここ数日ずっと夜更かしでした.

この 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 分で解決する問題にさらに 2 日間苦労することは避けたいと思います。

助けていただければ幸いです。

グレッグ

4

1 に答える 1

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>

それが役に立てば幸い。

于 2013-02-20T22:31:30.540 に答える