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
Vous devez vous connecter pour publier un commentaire.
Le problème est que dans le modèle d'appariement
ROOT
il n'est pas toutxsl:apply-templates
. Un modèle est sélectionné pour l'exécution en raison d'unexsl:apply-templates
instruction. Dans votre code, il n'est pas toutxsl:apply-templates
, donc le processeur XSLT ne pas appliquer des modèles et des finitions d'exécution.Ce serait différent si vous avez remplacé
xsl:copy-of
avecxsl:apply-templates
.Ici est de savoir comment ce faire:
Lorsque cette transformation est appliquée sur le document XML:
le voulait, résultat correct est produit:
OriginalL'auteur Dimitre Novatchev