2014-05-21 2 views
1

요소를 그룹화 한 다음 형제를 하위 요소로 반환하는 방법은 무엇입니까? 여기 두 개의 XML 문서와 함께 요소 그룹화 XSLT2.0

내가 달성하기 위해 노력하고있어의 자르는

customers.xml

<customers> 
    <customer> 
    <fname>James</fname> 
    <orderid>1234</orderid> 
    </customer>  
(실제로는 코드가 여러 고객, 주문 및 식품의 유형이있을 것이다, 그래서 이것은 단지 SNIPPIT입니다)입니다

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> 

그래서 나는 모든 종류의 음식을 하나로 모으고 그 이름과 크기를 하위 요소로하고 싶습니다. 가능한 가장 간단한 방법으로 이것을 어떻게 달성 할 수 있습니까?

+0

이것은 태그를 사용하여 XSLT 2.0에서 쉽게 가능합니다. 지금까지 뭐 해봤 어? –

답변

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>