2010-11-30 10 views
1

Ich habe eine XML, das so geht:XSLT für XML Segmentieren

<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 nur die ersten n Knoten, 3 beispielsweise zur Auswahl, so kann ich:

<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 01 zu verwenden, Danke für Ihre Hilfe

+0

Gute Frage, +1. Siehe meine Antwort für eine vollständige und extrem kurze Lösung. :) –

Antwort

2

Wie kann ich eine XSLT-Vorlage für Auswahl 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: Durch kno Flügel nur ein bisschen XPath und XSLT.

Complete (aber kurz noch) 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 der 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 th e wollte, korrektes Ergebnis:

<company> 
    <employee name="john"/> 
    <employee name="sarah"/> 
    <employee name="kim"/> 
</company> 

beachten Sie:

  1. Die identity rule jeden Knoten kopieren verwendet wird "wie sie ist".

  2. Es gibt nur eine bestimmte Vorlage, die die Identitätsvorlage überschreibt. Es entspricht einem beliebigen employee Element mit einer Position in der Node-Liste größer als 3. Diese Vorlage hat einen leeren Körper, wodurch die übereinstimmenden Elemente effektiv verworfen werden.

0

Try this:

<xsl:for-each select="company/employee[position() &lt; 3]"> 
    ... 
</xsl:for-each> 

Auch dies mit <template select=.... funktionieren könnte, aber ich bin nicht sicher.

2

kann ich die folgende XPath verwenden erreichen, dass:

/company/employee[position() < (last() - count(/company/employee)+4)] 

beachten Sie, dass hier last() zu count(/company/employee) gleich ist, so dass dies wird reduzieren:

/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):

<xsl:param name="pTop" select="3"/>  

<xsl:template match="employee">  
    <xsl:if test="$pTop >= position()">  
    ... 
    </xsl:if> 
</xsl:template>