xslt для преобразования формата xml-документа

#asp.net #xml #xslt

#asp.net #xml #xslt

Вопрос:

у меня есть xml в структуре, подобной этой:

 <RWFCriteria reportType="ProgramReview">
  <item id="36" name="" value="9" type="Milestone" />
  <item id="31" name="" value="9" type="Milestone" />
  <item id="33" name="" value="11" type="Milestone" />
</RWFCriteria>
  

и нужно, чтобы это было преобразовано в:

 <data>
  <release id="9">  <milestone id="36" /> <milestone id="31" /> </release>
  <release id="11"> <milestone id="33" /> </release>
</data>
  

как бы выглядел XSLT для этого преобразования?

Ответ №1:

Вам нужно сгруппировать элементы на основе их атрибута value. Если вы используете xslt 1, вы можете сделать это с помощью метода Мюнхиана, который будет выглядеть примерно так:

   <xsl:key name="item-value" match="item" use="@value" />

  <xsl:template match="/RWFCriteria">

    <data>
      <xsl:for-each select="item[count(. | key('item-value', @value)[1]) = 1]">
        <release id="{@value}">
          <xsl:for-each select="key('item-value', @value)">
            <milestone id="{@id}" />
          </xsl:for-each>
        </release>
      </xsl:for-each>
    </data>

  </xsl:template>
  

Комментарии:

1. @Alejandro Спасибо за исправление атрибутов

2. Никаких проблем. 1 за правильный ответ. (Кроме того, мне не нравятся вложенные xsl:for-each )

3. @Alejandro Я тоже, обычно я бы перенес все в их собственный шаблон, но мне показалось, что так понятнее.