2017-10-06 3 views
1

je le XML d'entrée suivante:Ajouter un élément entre deux autres éléments via XSLT?

<root> 
    <aaa>some string aaa</aaa> 
    <bbb>some string bbb</bbb> 
    <ddd>some string ddd</ddd> 
</root> 

En utilisant XSLT Je veux la sortie suivante:

<root> 
    <aaa>some string aaa</aaa> 
    <bbb>some string bbb</bbb> 
    <ccc>some string ccc</ccc> 
    <ddd>some string ddd</ddd> 
</root> 

Mon XSLT est:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="root"> 
     <root> 
      <ccc>some string ccc</ccc> 
      <xsl:apply-templates select="@*|node()"/> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

Mais je ne reçois pas mon Sortie désirée. Comment pourrais-je mettre l'élément ccc entre les éléments bbb et ddd en utilisant le modèle d'identité?

Je peux utiliser XSLT 3.0 si cela peut vous aider.

+0

Vous n'avez pas besoin de XSLT 3.0 ici - XSLT 1.0 suffit amplement. – kjhughes

Répondre

2

La réponse de Kenneth est bien, mais que la question est étiqueté comme XSLT 3.0, il peut être écrit plus compact ajouter si cette réponse comme une alternative

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="3.0"> 

    <xsl:output indent="yes"/> 

    <xsl:mode on-no-match="shallow-copy"/> 

    <xsl:template match="ddd"> 
     <ccc>some string ccc</ccc> 
     <xsl:next-match/> 
    </xsl:template> 

</xsl:stylesheet> 

utilisant <xsl:mode on-no-match="shallow-copy"/> pour exprimer la transformation de l'identité et de l'utilisation <xsl:next-match/> de déléguer la copie du ddd élément à lui.

+0

Merci de m'aider, les deux réponses sont bonnes. –

+0

Très agréable de voir la solution XSLT 3.0 pour la comparaison. – kjhughes

2

Utilisez la transformation d'identité avec un deuxième modèle qui correspond à l'élément avant ou après le point d'insertion, puis insérez le nouvel élément après ou avant la copie sur l'élément correspondant. À savoir:

Compte tenu de cette XML d'entrée,

<root> 
    <aaa>some string aaa</aaa> 
    <bbb>some string bbb</bbb> 
    <ddd>some string ddd</ddd> 
</root> 

ce XSLT,

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="ddd"> 
    <ccc>some string ccc</ccc> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

va générer ce code XML de sortie:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <aaa>some string aaa</aaa> 
    <bbb>some string bbb</bbb> 
    <ccc>some string ccc</ccc> 
    <ddd>some string ddd</ddd> 
</root>