Wie die Informationen zu erhalten und sortieren, um eine Teilmenge von Elementen mit nur Identifikatoren XSLT verwenden?
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.
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]) > 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.