Frage

In Anbetracht der folgenden XML:

<results name="queryResults">
  <int name="intfield1:[* TO 10]">11</int> 
  <int name="intfield2:[10 TO 20]">9</int> 
  <int name="intfield1:[10 TO 20]">12</int> 
</results>

Ich möchte diese XML erzeugen:

<results>
    <field name="numberfield1">
        <value name="[* TO 10]">11</value>
        <value name="[10 TO 10]">12</value>
    </field>
    <field name="numberfield2">
        <value name="[10 TO 20]">9</value>
    </field>
</results>

Ich kann nicht glauben, wie dies vor allem in XSL zu tun, weil ich von der numbericfield zur Gruppe bin zu wollen .. Alles, was ich mit oben kommen kann ist folgende:

<xsl:if test="count(results/int) &gt; 0">
    <results>
    <xsl:for-each select="results/int">
        <field>
            <xsl:attribute name="name">
                <xsl:value-of select="substring-before(@name, ':')"/></xsl:attribute>
            <value>
                <xsl:attribute name="name">
                    <xsl:value-of select="substring-after(@name, ':') "/>
                </xsl:attribute>
                <xsl:value-of select="."/>
            </value>
        </field>
    </xsl:for-each>
    </results>
</xsl:if>

Dies gilt jedoch nicht die schöne gruppierte Liste zu erzeugen, anstatt das ich bekommen:

<results>
    <field name="numberfield1">
        <value name="[* TO 10]">11</value>
    </field>
    <field name="numberfield2">
        <value name="[10 TO 20]">9</value>
    </field>
    <field name="numberfield1">
        <value name="[10 TO 10]">12</value>
    </field>
</results>

Wenn jemand mich in der richtigen Richtung stear kann .. Das wäre toll?

Danke

War es hilfreich?

Lösung

Um dies zu tun, in XSLT 1.0, erhalten Sie eine Technik verwenden, müssen genannt "Muench Gruppierung ". Erstellen Sie zunächst einen Schlüssel der Knoten, auf dem Sie gruppieren möchten

<xsl:key name="intfield" match="int" use="substring-before(@name, ':')" />

Als nächstes wiederholen Sie es durch alle Knoten, sondern nur diejenigen auswählen, die zuerst in der jeweiligen Gruppe sein passiert

<xsl:for-each select="int[generate-id() = generate-id(key('intfield', substring-before(@name, ':'))[1])]">

Als Nächstes können Sie Iterierte verwenden, um die Schlüssel zu iterieren über alle Knoten in der Gruppe

<xsl:variable name="intfieldname" select="substring-before(@name, ':')"/>
<xsl:for-each select="key('intfield', $intfieldname)">

das Setzen alle zusammen gibt

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml"/>
   <xsl:key name="intfield" match="int" use="substring-before(@name, ':')"/>
   <xsl:template match="/results">
      <results>
         <xsl:for-each select="int[generate-id() = generate-id(key('intfield', substring-before(@name, ':'))[1])]">
            <xsl:variable name="intfieldname" select="substring-before(@name, ':')"/>
            <field>
               <xsl:attribute name="name">
                  <xsl:value-of select="$intfieldname"/>
               </xsl:attribute>
               <xsl:for-each select="key('intfield', $intfieldname)">
                  <value>
                     <xsl:attribute name="name">
                        <xsl:value-of select="substring-after(@name, ':')"/>
                     </xsl:attribute>
                     <xsl:value-of select="."/>
                  </value>
               </xsl:for-each>
            </field>
         </xsl:for-each>
      </results>
   </xsl:template>
</xsl:stylesheet>

In Ihrem Beispiel 'intfield' wird 'Number' though. Ich habe den Namen als ‚intfield‘ im obigen Beispiel gehalten.

  • Festtippfehler.

Andere Tipps

Muench-Gruppierung ist ein Werk des Genies. Es ist nicht leicht zu verstehen, aber sehen: http://www.jenitennison.com/xslt/grouping/muenchian.html

Um den Prozess zu vereinfachen, die W3C speziell in XSLT2.0 unterstützt Gruppierung. Siehe zum Beispiel: http://www.xml.com/pub/a/ 2003/11/05 / tr.html

Doch nicht alle Umgebungen Unterstützung XSLT2.0

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top