Wie die Informationen zu erhalten und sortieren, um eine Teilmenge von Elementen mit nur Identifikatoren XSLT verwenden?

StackOverflow https://stackoverflow.com/questions/2418515

  •  19-09-2019
  •  | 
  •  

Frage

Ich bin neu in XSLT und ich kann das folgende Problem nicht lösen:

Ich habe eine XML-Datei wie folgt aus:

<root>
    <subset>
        <e id="A"></e>
        <e id="C"></e>
    </subset>

    <data>
        <info id="A" order="3" name="ANode"></info>
        <info id="B" order="4" name="BNode"></info>
        <info id="C" order="1" name="CNode"></info>
        <info id="D" order="2" name="DNode"></info>
    </data>
</root>

Und ich will diese produzieren:

<root>
    <newnode id="C" order="1" name="CNode"></newnode>
    <newnode id="A" order="3" name="ANode"></newnode>
</root>

Wie Sie die Idee zu sehen ist „vollständig“ die Teilmenge von ids durch die jeweiligen Informationen abrufen und sortieren sie entsprechend ihrer Reihenfolge auf <data> angegeben.

Beachten Sie, dass <data> soll eine Menge von untergeordneten Knoten haben.

Auch ich bin Trennung der Knoten mit den Informationen über das <data> Element aus den Untergruppen von ids, weil ich viele Untergruppen haben werde, und ich möchte nicht wiederholt Informationen hat „überall“.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Sie auch aus der Teilmenge Schlüssel könnten je nachdem, was sonst müssen Sie mit Ihren tatsächlichen Daten tun.

<xsl:output indent="yes" />

<xsl:key name="subset" match="e" use="@id" />

<xsl:template match="/">
    <root>
    <xsl:for-each select="//info[count(key('subset',@id)[1]) &gt; 0]">
        <xsl:sort select="@order" data-type="number" />
        <newnode id="{@id}" order="{@order}" name="{@name}" />
    </xsl:for-each>
    </root>
</xsl:template>

Andere Tipps

Querverweise stellen für die Verwendung von Tasten:

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

  <xsl:output indent="yes"/>

  <xsl:key name="k1" match="info" use="@id"/>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="subset/e">
        <xsl:sort select="key('k1', @id)/@order" data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="e">
    <newnode id="{@id}" order="{key('k1', @id)/@order}" name="{key('k1', @id)/@name}"/>
  </xsl:template>

</xsl:stylesheet>

Das sollte für die Eingangsabtastwert tun Sie präsentiert.

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