2010-05-26 7 views
2

J'ai un tas de fichiers xml avec une quantité variable de nœuds de données et je veux changer les fichiers en utilisant XSLT pour inclure uniquement des nœuds spécifiques. Exemple:Supprimer tous les nœuds de xml en excluant des nœuds spécifiques en utilisant XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<SomeName> 
<identifier> 
    <UID> 1234 </UID> 
</identifier> 
<MainNode1> 
    <SubNode1> 
     <Subnode1a>DATA1a0</Subnode1a> 
    </SubNode1> 
    <SubNode1> 
     <Subnode1a>DATA1a1</Subnode1a> 
    </SubNode1> 
    <SubNode1> 
     <Subnode1a>DATA1a2</Subnode1a> 
    </SubNode1> 
    </MainNode1> 

    <MainNode2> 
    <SubNode2> 
     <Subnode2a>DATA2a0</Subnode2a> 
    </SubNode2> 
    </MainNode2> 

    <MainNodeIDONTCARE> 
     <SubnodeWhatever> 
     </SubnodeWhatever> 
    </MainNodeIDONTCARE> 

    <MainNodeuseless> 
     <SubnodeWhatever> 
     </SubnodeWhatever> 
    </MainNodeuseless> 

    <MainNodewhatever> 
     <SubnodeWhatever> 
     </SubnodeWhatever> 
    </MainNodewhatever> 
</SomeName> 

Maintenant, mon fichier XML final devrait ressembler à:

<?xml version="1.0" encoding="UTF-8"?> 
<SomeName> 
<identifier> 
    <UID> 1234 </UID> 
</identifier> 
<MainNode1> 
    <SubNode1> 
     <Subnode1a>DATA1a0</Subnode1a> 
    </SubNode1> 
    <SubNode1> 
     <Subnode1a>DATA1a1</Subnode1a> 
    </SubNode1> 
    <SubNode1> 
     <Subnode1a>DATA1a2</Subnode1a> 
    </SubNode1> 
    </MainNode1> 

    <MainNode2> 
    <SubNode2> 
     <Subnode2a>DATA2a0</Subnode2a> 
    </SubNode2> 
    </MainNode2> 
</SomeName> 

J'ai essayé pour le faire avec XSLT, mais je ne peux pas sembler le faire.

Merci pour toute aide.

+0

Bonne question (+1). Voir ma réponse pour la solution la plus courte qui est aussi exactement dans l'esprit de XSLT et n'utilise aucune instruction ''. :) –

Répondre

1

Cela devrait fonctionner:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="SomeName"> 
    <xsl:copy> 
     <xsl:for-each select="identifier|MainNode1|MainNode2"> 
     <xsl:copy> 
      <xsl:apply-templates /> 
     </xsl:copy> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 

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

</xsl:stylesheet> 
0

Ici, il est

<?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="SomeName"> 
    <xsl:copy> 
     <xsl:for-each select="identifier|MainNode1|MainNode2"> 
     <xsl:apply-templates select="." /> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 

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

Ne comprend pas l'identificateur, MainNode1, MainNode2 tel que requis par l'OP. – AxelEckenberger

+0

@Obalix: merci pour le commentaire, j'ai corrigé l'erreur à ma manière. Votre solution convient également. – Gart

2

Probablement la plus courte solution est la suivante:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template 
match="MainNodeIDONTCARE | MainNodeuseless | MainNodewhatever"/> 
</xsl:stylesheet> 

Lorsque cette transformation est appliquée sur la document XML fourni, le wante d sortie est produit:

<SomeName> 
    <identifier> 
     <UID> 1234 </UID> 
    </identifier> 
    <MainNode1> 
     <SubNode1> 
      <Subnode1a>DATA1a0</Subnode1a> 
     </SubNode1> 
     <SubNode1> 
      <Subnode1a>DATA1a1</Subnode1a> 
     </SubNode1> 
     <SubNode1> 
      <Subnode1a>DATA1a2</Subnode1a> 
     </SubNode1> 
    </MainNode1> 
    <MainNode2> 
     <SubNode2> 
      <Subnode2a>DATA2a0</Subnode2a> 
     </SubNode2> 
    </MainNode2> 
</SomeName> 

Prenez note l'utilisation du modèle de conception XSLT le plus fondamental: l'utilisation et la substitution de la règle d'identité.

+0

Cette solution n'est bonne que si vous connaissez tous les éléments que vous voulez éliminer – Gart

+0

@Gart: Oui, l'OP n'a pas spécifiquement indiqué s'il veut que tous les éléments soient supprimés sauf quelques éléments connus, ou s'il veut tous les éléments copiés sauf certains éléments. –

+0

C'est vraiment ce dont j'avais besoin. Il est beaucoup plus facile d'exclure de nouveaux nœuds que d'avoir à mettre à jour un XLST avec tous les nœuds comme copie, lorsque la structure est modifiée. – 2ndkauboy

Questions connexes