2010-11-02 30 views
0

J'ai un document XML qui contient des nœuds supplémentaires à différents niveaux que je veux supprimer via XSLT. Mon intuition est de générer un XSD (en utilisant Altova ou similaire), supprimer les éléments que je ne veux pas voir apparaître dans ma sortie, puis laisser l'éditeur (Altova ou similaire) générer automatiquement un XSLT pour transformer le vieux XSD dans le nouveau XSD.Quel est le moyen le plus simple de rogner des valeurs XML?

A l'époque, j'écrivais XSL manuellement à la main ... mais avec tous ces outils sympas, y a-t-il vraiment une raison ou quelqu'un peut-il suggérer une alternative? Je ne l'ai pas fait ce genre de choses dans quelques années, alors je me suis dit que je demanderais ...

J'ai fini par venir avec ce qui est assez simple, donc merci pour la suggestion:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" > 
<xsl:output method="xml" indent="yes"/> 

    <xsl:template xpath-default-namespace="http://www.tempuri.org" match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template xpath-default-namespace="http://www.tempuri.org" match="SomeNode"> 
    </xsl:template> 
    <xsl:template xpath-default-namespace="http://www.tempuri.org" match="TheNode[@type!='SomeType' and @type!='OtherType']"> 
    </xsl:template> 

</xsl:stylesheet> 

La dernière chose que je dois faire est de vérifier la présence d'un élément manquant "SomeSubElement" de "TheNode" et d'insérer un élément vide s'il est manquant.

Des suggestions sur comment faire cela? Merci.

+0

En ce qui raisons vont, il est probablement plus rapide d'écrire le XSLT que le XSD ... – annakata

+0

En premier lieu, c'est une autre question. Vous devriez demander à nouveau. Deuxièmement, ce n'est pas la façon de traiter QNames: mettez juste un 'xpath-default-namespace =" http://www.tempuri.org "' dans l'élément racine 'stylesheet', ou mettez une déclaration d'espace de nommage' xmlns : temp = "http://www.tempuri.org" 'dans l'élément racine' stylesheet' et utilisez un QName complet dans des modèles comme 'temp: SomeNode' –

Répondre

3

Une simple identité de transformation avec des modèles vides pour ce que vous voulez jeter:

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

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

    <xsl:template match="tagToBeRemoved"/> 

</xsl:stylesheet> 
+0

Je n'arrive pas à obtenir que mes tags soient supprimés respecté. J'ai . J'ai aussi essayé comme . Merci pour l'aide! – Jeff

+0

@ JeffN825: Si vous rencontrez toujours des difficultés, modifiez votre publication pour inclure des exemples d'entrée XML et les modèles vides de votre XSLT qui ne fonctionnent pas. –

+0

@ JeffN825: Peut-être y a-t-il des déclarations d'espace de noms? –