2017-05-11 3 views
0

Ich habe eine XML-Schnipsel wie folgt aus:XSLT 1.0 verschachtelte Gruppierung

<root> 
    <order> 
     <item> 
      <item_type>A</item_type> 
      <item_type>A</item_type> 
      <item_type>B</item_type> 
      <item_type>C</item_type> 
     </item> 
    </order> 
    <order> 
     <item> 
      <item_type>A</item_type> 
      <item_type>B</item_type> 
      <item_type>C</item_type> 
      <item_type>C</item_type> 
     </item> 
    </order> 
    <order> 
     <item> 
      <item_type>C</item_type> 
      <item_type>C</item_type> 
      <item_type>B</item_type> 
     </item> 
    </order> 
</root> 

und ich brauche es durch ITEM_TYPE Element Gruppe, sondern auf „Ordnung“ Element Umfang, so wäre mein Wunsch ausgegeben werden:

<root> 
    <order> 
     <item>A</item> 
     <item>B</item> 
     <item>C</item> 
    </order> 
    <order> 
     <item>A</item> 
     <item>B</item> 
     <item>C</item> 
    </order> 
    <order> 
     <item>B</item> 
     <item>C</item> 
    </order> 
</root> 

Ich benutze diese XSLT Version 1.0, aber ich kann es nicht herausfinden.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:key name="groups" match="order/item" use="item_type"> 
    </xsl:key> 
    <xsl:template match="/"> 
     <xsl:for-each select="//root/order"> 
      <order>     
       <xsl:for-each select="item[generate-id() = generate-id(key('groups', item_type))]"> 
        <item> 
         <xsl:value-of select="key('groups', item_type)"/> 
        </item> 
       </xsl:for-each> 
      </order> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Lösung muss in xslt 1.0 sein.

Antwort

1

Sie haben zahlreiche Fragen, die wichtigsten sind:

  • Sie möchten Gruppe item_type s, nicht item s. Das bedeutet, dass Ihr Schlüssel mit item_type übereinstimmen muss;

  • Sie möchten sie in ihrem order s gruppieren. Das bedeutet, dass Ihr Schlüssel eine eindeutige order Kennung enthalten muss.

Daher Ihren Schlüssel definiert werden muss, wie:

<xsl:key name="groups" match="item_type" use="concat(., '|', generate-id(ancestor::order))"/> 

Zusätzlich Ihre Syntax für Muench-Gruppierung ist falsch. Und Sie geben kein Root-Element aus.

es auf diese Weise versuchen:

XSLT 1,0

<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:strip-space elements="*"/> 

<xsl:key name="groups" match="item_type" use="concat(., '|', generate-id(ancestor::order))"/> 

<xsl:template match="/root"> 
    <root> 
     <xsl:for-each select="order"> 
      <order>     
       <xsl:for-each select="item/item_type[generate-id() = generate-id(key('groups', concat(., '|', generate-id(ancestor::order)))[1])]"> 
        <item> 
         <xsl:value-of select="."/> 
        </item> 
       </xsl:for-each>  
      </order> 
     </xsl:for-each>  
    </root> 
</xsl:template> 

</xsl:stylesheet> 

auf Ihre Eingabe Beispiel angewendet wird, wird das Ergebnis sein:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <order> 
    <item>A</item> 
    <item>B</item> 
    <item>C</item> 
    </order> 
    <order> 
    <item>A</item> 
    <item>B</item> 
    <item>C</item> 
    </order> 
    <order> 
    <item>C</item> 
    <item>B</item> 
    </order> 
</root> 
+0

Hmm .. ich wusste, dass ich den Schlüssel „irgendwie anders“ zu komponieren, aber ich xslt verwenden sehr selten und die Muench-Gruppierung in XSLT 1.0 sieht wenig mir fremd. Das verpasste Root-Element war nur ein Tippfehler in der Transformation. Ihre Lösung funktioniert wie ein Zauber, danke :) – paYa

0

Wenn Sie es mit nur tun wollen XPath können Sie dies verwenden.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:template match="/"> 
     <xsl:for-each select="//root/order"> 
      <order>     
       <xsl:for-each select="item/item_type[not(preceding-sibling::item_type=.)]"> 
        <item> 
         <xsl:value-of select="."/> 
        </item> 
       </xsl:for-each> 
      </order> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
+0

[Muenchian Gruppierung] (http://www.jenitennison.com/xslt/grouping/muenchian.html) wurde erfunden, weil dies keine gute Methode ist. –