Comment appliquer plusieurs modèle de définitions où chacun d'eux est en train de changer la même structure XML

Dans cet exemple de code, j'ai 2 défis est de mettre en B1 nœud après nœud B et avant que le nœud C, D et E et le deuxième défi est d'Ajouter la deuxième CLÉ de nœud à l' /ROOT/E/AUTRES/FACE/CLÉS de la structure.

Cet exemple XML:

        <ROOT>
          <A>some A text</A>
          <B>some B text</B>
          <C>some C text</C>
          <D>some D text</D>
          <E>
            <OTHER>
              <DEAL>
                <KEYS>
                  <KEY>
                    <KeyIdentifierType>KeyIdentifierTypeA</KeyIdentifierType>
                    <KeyValue>123456|1</KeyValue>
                  </KEY>
                </KEYS>
              </DEAL>
            </OTHER>
          </E>
        </ROOT>

après la transformation:

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <xsl:strip-space elements="*"/>
        <xsl:output method="xml" indent="yes"/>

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

        <!-- Identifiers are added by the system. Need to pass parms from the calling program -->
        <xsl:template match="ROOT" name="add-B1">
            <xsl:variable name="elements-after" select="C|D|E"/>
            <xsl:copy>
                <xsl:copy-of select="* except $elements-after"/>
                <B1>some B1 text</B1>
                <xsl:copy-of select="$elements-after"/>
            </xsl:copy>
        </xsl:template>

        <!-- KEY is added by the system. Need to pass parms from the calling program -->
        <xsl:template match="ROOT/E/OTHER/DEAL/KEYS" name="add-KEYS">
            <xsl:param name="KeyIdentifierTypeB">654321|1</xsl:param>
            <xsl:copy>
                <xsl:copy-of select="*"/>
                <KEY>
                    <KeyIdentifierType>KeyIdentifierTypeB</KeyIdentifierType>
                    <KeyValue>
                        <xsl:value-of select="$KeyIdentifierTypeB"/>
                    </KeyValue>
                </KEY>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>

devenir:

        <?xml version="1.0" encoding="UTF-8"?>
        <ROOT>
            <A>some A text</A>
            <B>some B text</B>
            <B1 xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">some B1 text</B1>
            <C>some C text</C>
            <D>some D text</D>
            <E>
                <OTHER>
                    <DEAL>
                        <KEYS>
                            <KEY>
                                <KeyIdentifierType>KeyIdentifierTypeA</KeyIdentifierType>
                                <KeyValue>123456|1</KeyValue>
                            </KEY>
                        </KEYS>
                    </DEAL>
                </OTHER>
            </E>
        </ROOT>

pourquoi la deuxième définition du modèle a été complètement ignoré?

Le premier code du collège a été résolu B1 nœud est défini après B nœud et avant que le nœud C, D et E, ou en d'autres termes B1 nœud est défini, et les nœuds qui doivent être des lieux après: C, D et E.

Le deuxième template match="ROOT/E/AUTRES/FACE/KEYS" qui devrait satisfaire le deuxième défi de la partie: pour Ajouter le deuxième nœud à l' /ROOT/E/AUTRES/FACE/CLÉS de la structure, a été complètement ignoré.
En plus de ce fait, si vous le commentaire de la première template match sur le nœud RACINE, le deuxième template match="ROOT/E/AUTRES/FACE/TOUCHES" fonctionne correctement, il va ajouter la touche supplémentaire, mais je ne sais pas pourquoi le premier modèle ne correspond toujours la priorité sur le second. J'ai essayer le code xsl:template match="ROOT/E/AUTRES/FACE/TOUCHES... et le xsl:for-each select=... et xsl:call-template name="add-CLÉS" mais rien ne m'a aidé.

Je l'ai fait comprendre, que apply-templates, correspondent à des nœuds de modèles avec plus de structure avec la priorité la plus élevée. Changer de modèle de place dans le fichier XSLT n'aura pas d'impact, il ne sera pas lue dans la ligne exacte de la séquence, au lieu de cela, il sera procédé par correspondance priorité.
“apply-templates” pour chaque correspondance modèle sera procédé à une modification de la structure XML, de façon implicite, il sera fait le "for-each" pour nous, mais je ne sais pas comment le "conseil" le deuxième modèle de la structure a été modifiée, et pourquoi je devrais le faire, parce que le second modèle de match est à la recherche d'un autre emplacement XPath, qui d'ailleur n'a jamais été touché depuis le premier modèle. Dois-je appliquer le modèle de séquencement dans mon cas?... et quelle est la meilleure pratique comment faire?

Résultat attendu:

        <?xml version="1.0" encoding="UTF-8"?>
        <ROOT>
            <A>some A text</A>
            <B>some B text</B>
            <B1>some B1 text</B1>
            <C>some C text</C>
            <D>some D text</D>
            <E>
                <OTHER>
                    <DEAL>
                        <KEYS>
                            <KEY>
                                <KeyIdentifierType>KeyIdentifierTypeA</KeyIdentifierType>
                                <KeyValue>123456|1</KeyValue>
                            </KEY>
                            <KEY>
                                <KeyIdentifierType>KeyIdentifierTypeB</KeyIdentifierType>
                                <KeyValue>654321|1</KeyValue>
                            </KEY>
                        </KEYS>
                    </DEAL>
                </OTHER>
            </E>
        </ROOT>

OriginalL'auteur Haris Priganica | 2012-08-24