Domanda

Ho un XML che va in questo modo:

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

Come posso utilizzare un modello XSLT per la selezione solo i primi n nodi, 3, per esempio, in modo da posso ottenere:

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

In ossigeno editor XML, posso utilizzare il seguente XPath per raggiungere questo:

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

, ma ho davvero bisogno di utilizzare XSLT in questo caso
Grazie per il vostro aiuto

È stato utile?

Soluzione

  

Come faccio a utilizzare un modello XSLT per   selezionando solo i primi nodi n, 3   per esempio, in modo da posso ottenere:

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

La risposta breve :. Conoscendo solo un po 'XPath e XSLT

Complete (ma comunque a breve) risposta :

Questa trasformazione :

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

quando applicato sul documento XML fornito :

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

produce il desiderato, risultato corretto :

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

Do nota :

  1. La regola identità viene utilizzato per copiare ogni nodo "così com'è".

  2. C'è solo un modello specifico ignorando l'identità template . Corrisponde a qualsiasi elemento employee con posizione nella maggiore nodo lista di 3. Questo modello ha un corpo vuoto, efficacemente scartando gli elementi corrispondenti.

Altri suggerimenti

  

posso usare il seguente XPath per   ottenere che:

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

Do atto che qui last() è pari a count(/company/employee), quindi questo sarà ridurre a:

/company/employee[4 > position()]

In un modello si potrebbe avere:

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

Lo stesso con la parametrizzazione (Remenber non è possibile utilizzare il parametro di riferimento in XSLT 1.0 modelli):

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

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

Prova questo:

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

Questo lavoro potrebbe con <template select=.... troppo, ma non sono sicuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top