XSLT für Segmentierungs XML
Frage
Ich habe eine XML, das so geht:
<company>
<employee name="john"/>
<employee name="sarah"/>
<employee name="kim"/>
<employee name="karl"/>
<employee name="tom"/>
<employee name="jim"/>
<employee name="sandy"/>
</company>
Wie kann ich eine XSLT-Vorlage verwenden, um nur die ersten n Knoten, 3 beispielsweise die Auswahl, so dass ich bekommen kann:
<company>
<employee name="john"/>
<employee name="sarah"/>
<employee name="kim"/>
</company>
In Oxygen XML-Editor kann ich die folgende XPath verwenden, das zu erreichen:
/company/employee[position() < (last() - count(/company/employee)+4)]
, aber ich brauche wirklich XSLT in diesem Fall
verwenden
Vielen Dank für Ihre Hilfe
Lösung
Wie kann ich eine XSLT-Vorlage für Auswählen nur die ersten n Knoten, 3 zum Beispiel, so kann ich:
<company> <employee name="john"/> <employee name="sarah"/> <employee name="kim"/> </company>
Die kurze Antwort . Mit dem Wissen, nur ein wenig XPath und XSLT
Complete (aber noch kurz) Antwort :
Diese Transformation :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="employee[position() > 3]"/>
</xsl:stylesheet>
, wenn auf dem mitgelieferten XML-Dokument angelegt :
<company>
<employee name="john"/>
<employee name="sarah"/>
<employee name="kim"/>
<employee name="karl"/>
<employee name="tom"/>
<employee name="jim"/>
<employee name="sandy"/>
</company>
produziert das wollte, korrekte Ergebnis :
<company>
<employee name="john"/>
<employee name="sarah"/>
<employee name="kim"/>
</company>
Do Note :
-
Die Identität Regel verwendet wird jeden Knoten "wie besehen" zu kopieren.
-
Es gibt nur eine bestimmte Vorlage überschreibt die Identität Vorlage . Es entspricht einer beliebigen
employee
Element mit Position in der Knotenliste größer als 3. Diese Vorlage einen leeren Körper hat, effektiv die angepassten Elemente verwerfen.
Andere Tipps
kann ich die folgende XPath erreichen, dass:
/company/employee[position() < (last() - count(/company/employee)+4)]
Zu beachten ist, dass hier last()
zu count(/company/employee)
gleich ist, so werden diese zu reduzieren, werden:
/company/employee[4 > position()]
In einem Muster könnten Sie haben:
<xsl:template match="employee[4 > position()]">
...
</xsl:template>
Das gleiche mit Parametrisierung (Remenber Sie nicht Parameterreferenz in XSLT 1.0-Muster verwenden können):
<xsl:param name="pTop" select="3"/>
<xsl:template match="employee">
<xsl:if test="$pTop >= position()">
...
</xsl:if>
</xsl:template>
Versuchen Sie diese:
<xsl:for-each select="company/employee[position() < 3]">
...
</xsl:for-each>
Dies könnte die Arbeit mit <template select=....
zu, aber ich bin sicher, dass es nicht.