2010-08-10 7 views
2

J'ai le xml à transformer. Mais je ne sais pas comment obtenir la valeur de l'étiquette du pilote principal dans le fichier XML transformé. Le pilote principal doit être basé sur la position des nœuds du pilote. Quelqu'un peut-il m'aider?position de l'élément parent xslt

<drivers> 
    <driver> 
    <first_name>Doug</first_name> 
    <last_name>Harry</last_name> 
    <vehicles> 
    <vehicle> 
    <vin>4T1BB46K08</vin> 
    <year>2008</year> 
    </vehicle> 
     </vehicles> 
     <records/> 
    </driver> 
    <driver> 
     <first_name>Sherry</first_name> 
     <last_name>Bloom</last_name> 
     <vehicles> 
      <vehicle> 
       <vin>5TDZA23C06</vin> 
       <year>2006</year> 
      </vehicle> 
     </vehicles> 
     <records/> 
    </driver> 
</drivers> 

Résultat devrait être

<Vehicles> 
    <vehicle> 
    <vin>4T1BB46K08</vin> 
    <year>2008</year> 
    <primarydriver>1</primarydriver> 
    </vehicle> 
    <vehicle> 
    <vin>5TDZA23C06</vin> 
    <year>2006</year> 
    <primarydriver>2</primarydriver> 
    </vehicle> 
</Vehicles> 
+0

Pourriez-vous reformater le code XML pour qu'il soit plus lisible? – developer

+0

Je ne sais pas comment formater ça. Toute aide serait appréciée. – Amzath

+0

Vous n'avez pas défini ce qu'est le "pilote principal" ??? Est-ce le premier pilote dans le document avec une valeur VIN? Si c'est le cas, votre document XML n'est pas représentatif: il n'y a que deux pilotes et chacun a un NIV différent, donc les deux sont des pilotes principaux. Vous devez publier un document XML dans lequel certains pilotes ne doivent pas être marqués dans le résultat en tant que pilotes principaux. –

Répondre

1

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:param name="pDriverPos"/> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/*"> 
    <Vehicles> 
    <xsl:apply-templates/> 
    </Vehicles> 
</xsl:template> 

<xsl:template match="driver"> 
    <xsl:apply-templates> 
    <xsl:with-param name="pDriverPos" select="position()"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="vehicles"> 
    <xsl:param name="pDriverPos"/> 

    <xsl:apply-templates> 
    <xsl:with-param name="pDriverPos" select="$pDriverPos"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="vehicle"> 
    <xsl:param name="pDriverPos"/> 

    <vehicle> 
    <xsl:apply-templates/> 
    <primarydriver><xsl:value-of select="$pDriverPos"/></primarydriver> 
    </vehicle> 
</xsl:template> 

<xsl:template match="first_name|last_name|records"/> 
</xsl:stylesheet> 

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

<drivers> 
    <driver> 
    <first_name>Doug</first_name> 
    <last_name>Harry</last_name> 
    <vehicles> 
    <vehicle> 
    <vin>4T1BB46K08</vin> 
    <year>2008</year> 
    </vehicle> 
     </vehicles> 
     <records/> 
    </driver> 
    <driver> 
     <first_name>Sherry</first_name> 
     <last_name>Bloom</last_name> 
     <vehicles> 
      <vehicle> 
       <vin>5TDZA23C06</vin> 
       <year>2006</year> 
      </vehicle> 
     </vehicles> 
     <records/> 
    </driver> 
</drivers> 

produit le résultat souhaité, correct:

<Vehicles> 
    <vehicle> 
     <vin>4T1BB46K08</vin> 
     <year>2008</year> 
     <primarydriver>1</primarydriver> 
    </vehicle> 
    <vehicle> 
     <vin>5TDZA23C06</vin> 
     <year>2006</year> 
     <primarydriver>2</primarydriver> 
    </vehicle> 
</Vehicles> 

Prenez note: L'utilisation d'une règle d'identité modifiée avec un paramètre qui passe la position du pilote en cours. Ceci est significativement plus efficace que de compter les frères et sœurs précédents.

0

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="drivers"> 
     <Vehicles> 
      <xsl:apply-templates/> 
     </Vehicles> 
    </xsl:template> 
    <xsl:template match="driver|driver/*|driver/*/text()"> 
     <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="vehicle/*[last()]"> 
     <xsl:call-template name="identity"/> 
     <primarydriver> 
      <xsl:value-of select="count(preceding::driver)+1"/> 
     </primarydriver> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

<Vehicles> 
    <vehicle> 
     <vin>4T1BB46K08</vin> 
     <year>2008</year> 
     <primarydriver>1</primarydriver> 
    </vehicle> 
    <vehicle> 
     <vin>5TDZA23C06</vin> 
     <year>2006</year> 
     <primarydriver>2</primarydriver> 
    </vehicle> 
</Vehicles> 

Remarque: comptage précédent.

Questions connexes