XSLT - Создать более простую структуру XML, чтобы избежать группировки - PullRequest
0 голосов
/ 21 марта 2012

Как мне конвертировать этот документ:

<Root>
  <!-- yes, I know I don't need a 'Root' element! Legacy code... -->
  <Plans>
    <Plan AreaID="1" UnitID="83">
      <Part ID="9122" Name="foo" />
      <Part ID="9126" Name="bar" />
    </Plan>
    <Plan AreaID="1" UnitID="86">
      <Part ID="8650" Name="baz" />
    </Plan>
    <Plan AreaID="2" UnitID="26">
      <Part ID="215" Name="quux" />
    </Plan>
    <Plan AreaID="1" UnitID="95">
      <Part ID="7350" Name="meh" />
    </Plan>
  </Plans>
</Root>

до:

<areas>
    <area id="1">
        <unit id="83">
            <part id="9122">foo</part>
            <part id="9126">bar</part>
        </unit>     
        <unit id="86">
            <part id="8650">baz</part>          
        </unit>     
        <unit id="95">
            <part id="7350">meh</part>          
        </unit>
    </area> 
    <area id="2">
        <unit id="26">
            <part id="215">quux</part>          
        </unit>             
    </area>
</areas>

Нужно ли группировать элементы области?

1 Ответ

2 голосов
/ 21 марта 2012

Вот пример таблицы стилей

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="k1" match="Plan" use="@AreaID"/>

  <xsl:template match="Plans">
    <areas>
      <xsl:apply-templates select="Plan[generate-id() = generate-id(key('k1', @AreaID)[1])]" mode="group"/>
    </areas>
  </xsl:template>

  <xsl:template match="Plan" mode="group">
    <area id="{@AreaID}">
      <xsl:apply-templates select="key('k1', @AreaID)"/>
    </area>
  </xsl:template>

  <xsl:template match="Plan">
    <unit id="{@UnitID}">
      <xsl:apply-templates/>
    </unit>
  </xsl:template>

  <xsl:template match="Part">
    <part id="{@ID}">
      <xsl:value-of select="@Name"/>
    </part>
  </xsl:template>      

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...