2014-04-22 3 views
1

J'ai un document xml que je dois remplacer des noeuds spécifiques avec des segments xml partiels qui contiennent à la fois des noeuds ainsi que le traitement-instructions. Je veux préserver les PI mais je rencontre des problèmes dans le remplacement.XSLT importer un segment XML partiel en XML avec traitement-instructions

exemple du segment: general.xml

<root> 
    <!--General Settings --> 
    <?mapping EnvironmentSetting="envname"?> 
    <setting name="SubscriptionName" value="*" /> 
</root> 

Source xml:

<environment> 
    <General /> 
</environment> 

Transform -

<xsl:template match="* | processing-instruction() | comment()"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*/General"> 
    <xsl:copy-of select="document('general.xml')/root"/> 
</xsl:template> 

La sortie est:

<environment> 
    <root> 
    <!--General Settings --> 
    <?mapping EnvironmentSetting="envname"?> 
    <setting name="SubscriptionName" value="*" /> 
    </root> 
</environment> 

Mais je veux:

<environment> 
    <!--General Settings --> 
    <?mapping EnvironmentSetting="envname"?> 
    <setting name="SubscriptionName" value="*" /> 
</environment> 

Modification de la section du document à la racine/* gouttes traitement-instructions (et commentaires)

<xsl:copy-of select="document('general.xml')/root/*"/> 
... 
<environment> 
    <setting name="SubscriptionName" value="*" /> 
</environment> 

Modification de la section du document à-instructions processus root/drops les nœuds

<xsl:copy-of select="document('general.xml')/root/processing-instruction()"/> 
... 
<environment> 
    <?mapping EnvironmentSetting="envname"?> 
</environment> 

Essayer de faire un | correspond juste au premier paramètre -

<xsl:copy-of select="document('general.xml')/root/processing-instruction() | * | comment()"/> 
... 
<environment> 
    <?mapping EnvironmentSetting="envname"?> 
</environment> 

Alors, comment puis-je obtenir mon gâteau et le manger aussi? J'ai l'air si proche, mais j'ai de la difficulté à trouver des exemples de ce que je veux faire.

+0

Votre modèle d'identité modifiée est plutôt étrange. Il est plus utile de commencer avec un modèle d'identité réel et d'ajouter des modèles vides pour les types de nœuds que vous ne voulez pas copier, par exemple. ' Tomalak

+0

Je ne sais pas bien compris votre commentaire, quelle partie de votre vous référant comme modèle d'identité Je suis assez nouveau à XSLT.? , alors s'il vous plaît pardonnez mon ignorance si cela semble que je pose une question stupide. – James

+0

Je me réfère à la première '' votre question. l'identité de transformation (aka modèle d'identité) est l'un des véritables bases de XSLT. Vous allez trouver des tonnes de matériel de lecture par ces mots-clés seul. – Tomalak

Répondre

0

Cela devrait le faire:

<xsl:template match="* | processing-instruction() | comment()"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*/General"> 
    <xsl:apply-templates select="document('general.xml')/root"/> 
</xsl:template> 

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

Sinon, vous pouvez faire une copie de plusieurs types de noeuds en utilisant l'opérateur syndical:

<xsl:template match="*/General"> 
    <xsl:variable name="r" select="document('general.xml')/root" /> 
    <xsl:apply-templates select="$r/* | $r/processing-instruction() | $r/comment()" /> 
</xsl:template> 
+0

premier exemple est exactement ce que je devais. J'ai fait des extraits de documents multiples et en fonction de ce que je veux comme XML de sortie, je dois saisir un ou plusieurs de ces extraits. I » regarderons plus dans votre 2ème exemple d'un moyen d'étendre ce que je fais ai pas encore utilisé les variables – James

+0

BTW:.. Il serait logique de définir des variables dont vous avez besoin plus d'une fois au niveau supérieur au lieu de l'intérieur des modèles individuels. – Tomalak