Группирование элементов вместе с двумя xml-документами XSLT2.0

Как можно сгруппировать элементы, а затем вернуть братьев и сестер в качестве подэлементов?

Вот отрывок того, чего я пытаюсь достичь (это всего лишь фрагмент, поэтому на самом деле в коде будет несколько клиентов, заказов и типов еды)

customers.xml

<customers>
  <customer>
    <fname>James</fname>
    <orderid>1234</orderid>
  </customer>      

orders.xml

<orders>
  <order>
    <orderid>1234</orderid>
    <name>soda</name>
    <size>large</size>
    <type>drink</type>
  </order>

  <order>
    <orderid>1234</orderid>
    <name>beer</name>
    <size>medium</size>
    <type>drink</type>
  </order>

  <order>
    <orderid>1234</orderid>
    <name>burger</name>
    <size>large</size>
    <type>food</type>

output.xml

<orders>
  <order>
    <fname>James</fname>
    <orderid>1234<orderid>
    <bought type="food">
      <name name="burger">
        <size>large</size>
      </name>
    </bought>
    <bought type="drink">
      <name name="soda">
        <size>large</size>
      </name>
      <name name="beer">
        <size>medium</size>
      </name>
    </bought>
  </order>
</orders>

Итак, я хочу сгруппировать все типы продуктов питания вместе и иметь их названия и размер в качестве подэлементов, как мне добиться этого самым простым способом?


person Community    schedule 21.05.2014    source источник
comment
Это легко сделать с XSLT 2.0, используя тег <for-each-group>. что ты уже испробовал?   -  person Marcus Rickert    schedule 21.05.2014


Ответы (1)


Ну, XSLT 2.0 имеет for-each-group, например.

<xsl:param name="orders-url" select="'orders.xml'"/>
<xsl:variable name="orders-doc" select="doc($orders-url)"/>

<xsl:key name="orderid" match="order" use="orderid"/>

<xsl:template match="customer">
  <order>
    <xsl:copy-of select="fname, orderid"/>
    <xsl:for-each-group select="key('orderid', orderid, $orders-doc)" group-by="type">
      <bought type="{type}">
        <xsl:apply-templates select="current-group()"/>
      </bought>
    </xsl:for-each-group>
  </order>
</xsl:template>

<xsl:template match="order">
  <name name="{name}">
    <xsl:copy-of select="size"/>
  </name>
</xsl:template>
person Martin Honnen    schedule 21.05.2014