2010-11-30 44 views
1

J'ai un fichier XML qui va comme ceci:XSLT pour segmenter XML

<company> 
    <employee name="john"/> 
    <employee name="sarah"/> 
    <employee name="kim"/> 
    <employee name="karl"/> 
    <employee name="tom"/> 
    <employee name="jim"/> 
    <employee name="sandy"/> 
</company> 

Comment puis-je utiliser un modèle XSLT pour sélectionner seulement les premiers noeuds n, 3 par exemple, donc je peux obtenir:

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

dans l'éditeur XML d'oxygène, je peux utiliser la XPath suivante pour y parvenir:

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

mais je vraiment besoin d'utiliser XSLT dans ce cas
Merci pour votre aide

+0

Bonne question, +1. Voir ma réponse pour une solution complète et extrêmement courte. :) –

Répondre

2

Comment puis-je utiliser un modèle XSLT pour sélectionner seulement les premiers noeuds n, 3 par exemple, je peux obtenir:

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

La réponse courte: par KNO aile juste un peu XPath et XSLT.

complète (mais courte) réponse:

Cette 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> 

lorsqu'il est appliqué sur le document XML fourni:

<company> 
    <employee name="john"/> 
    <employee name="sarah"/> 
    <employee name="kim"/> 
    <employee name="karl"/> 
    <employee name="tom"/> 
    <employee name="jim"/> 
    <employee name="sandy"/> 
</company> 

produit e e voulait, résultat correct:

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

Prenez note:

  1. Le identity rule est utilisé pour copier chaque nœud "en l'état".

  2. Il existe juste un modèle spécifique remplaçant le modèle d'identité. Il correspond à n'importe quel élément avec une position dans la liste de nœuds supérieure à 3. Ce modèle a un corps vide, rejetant efficacement les éléments correspondants.

0

Essayez ceci:

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

Cela pourrait fonctionner avec <template select=.... aussi, mais je ne suis pas sûr.

2

je peux utiliser la XPath suivante pour atteindre que:

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

Notez que la ici last() est égal à count(/company/employee), donc ce sera réduire à:

/company/employee[4 > position()] 

Dans un modèle que vous pourriez avoir:

<xsl:template match="employee[4 > position()]">  
... 
</xsl:template> 

La même chose avec paramétrisation (Rappeler le vous ne pouvez pas utiliser la référence des paramètres dans les modèles XSLT 1.0):

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

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