2017-06-16 1 views
0

Je dois ajouter ou insérer un autre élément et attribut <vat:IRmark Type="generic"/> après le <DefaultCurrency>. Et, il y a un certain groupe qui est l'élément <Group> que j'ai besoin d'ajouter un préfixe. Je l'ai presque fait, mais l'insertion d'élément ne fonctionnait pas. Voici mon fichier de test d'échantillon:Insérer un élément et ajouter un préfixe à l'aide de xslt

ENTRÉE fichier:

<Data> 
<Record> 
    <ID>123-AAA</ID> 
    <Date>2017-04-23</Date> 
    <Group> 
     <Hdr> 
      <ID>833-AAA</ID> 
      <DefaultCurrency>GBP</DefaultCurrency> 
      <Sender>truth</Sender> 
     </Hdr> 
    </Group> 
</Record> 

SORTIE GÉNÉRÉ:

<Data> 
<Record xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vat="http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2" schemaLocation="http://www.govtalk.gov.uk/CM/envelope http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2"> 
    <ID>123-AAA</ID> 
    <Date>2017-04-23</Date> 
    <vat:Group> 
    <vat:Hdr> 
     <vat:ID>833-AAA</vat:ID> 
     <vat:DefaultCurrency>GBP</vat:DefaultCurrency> 
     <vat:Sender>truth</vat:Sender> 
    </vat:Hdr> 
    </vat:Group> 
</Record> 

RÉSULTATS ATTENDUS:

<Data> 
<Record xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vat="http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2" schemaLocation="http://www.govtalk.gov.uk/CM/envelope http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2"> 
    <ID>123-AAA</ID> 
    <Date>2017-04-23</Date> 
    <vat:Group> 
    <vat:Hdr> 
     <vat:ID>833-AAA</vat:ID> 
     <vat:DefaultCurrency>GBP</vat:DefaultCurrency> 
     <vat:IRmark Type="generic"/> 
     <vat:Sender>truth</vat:Sender> 
    </vat:Hdr> 
    </vat:Group> 
</Record> 

Code XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vat="http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()[boolean(normalize-space())]|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="DefaultCurrency"> 
    <xsl:copy-of select="."/> 
     <vat:IRmark> 
      <xsl:attribute name="Type">generic</xsl:attribute> 
     </vat:IRmark> 
</xsl:template> 
<xsl:template match="*[ancestor-or-self::Group]"> 
    <xsl:element name="vat:{local-name()}"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
<xsl:template match="Record"> 
    <Record xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vat="http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2" schemaLocation="http://www.govtalk.gov.uk/CM/envelope http://www.govtalk.gov.uk/taxation/vat/vatdeclaration/2"> 
     <xsl:apply-templates/> 
    </Record> 
</xsl:template> 

Merci.

Répondre

2

Ceci est dû à la priorité du modèle. Le modèle correspondant à *[ancestor-or-self::Group] correspondra également à l'élément DefaultCurrency. En raison de la condition dans la correspondance de modèle, le modèle a une priorité plus élevée (0,5, je pense, par rapport à une priorité de 0 pour le modèle correspondant DefaultCurrency) et donc ce modèle sera utilisé.

Pour contourner ce problème, attribuer une priorité manuelle à votre modèle correspondant DefaultCurrency

<xsl:template match="DefaultCurrency" priority="1"> 

Vous pouvez lire sur la résolution des conflits pour les modèles à https://www.w3.org/TR/xslt#conflict

+0

http://lenzconsulting.com/how- xslt-works/# priority a aussi un tableau utile listant les différentes possibilités. –