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

War es hilfreich?

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 :

  1. Die Identität Regel verwendet wird jeden Knoten "wie besehen" zu kopieren.

  2. 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() &lt; 3]">
  ...
</xsl:for-each>

Dies könnte die Arbeit mit <template select=.... zu, aber ich bin sicher, dass es nicht.

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