2009-04-10 8 views
0

J'ai besoin de transformer beaucoup de fichiers XML (exportation Fedora) en un autre type de XML. Essayer de le faire avec des feuilles de style XSL et vérifier avec le transformateur msxsl.Filtrage le plus de XML avec XSL?

Soi-disant j'ai fichier xml comme celui-ci (en supposant qu'il ya effectivement d'autres nœuds à l'intérieur AAA, OBJ, amd tous les autres nœuds), source.xml:

<DOC> 
<AAA> 
    <STUFF>example</STUFF> 
    <OBJ> 
     <OBJVERS id="A1" CREATED="2008-02-18T13:28:08.245Z"/> 
     <OBJVERS id="A2" CREATED="2008-02-19T10:42:41.965Z"/> 
     <OBJVERS id="A13" CREATED="2009-03-16T12:43:11.703Z"/> 
    </OBJ> 
</AAA> 
<FFF/> 
<GGG/> 
<DDD> 
    <FILE /> 
</DDD> 
</DOC> 

que je dois ressembler à ceci (cible .XML):

<MYOBJ> 
     <ELEM>contents of OBJVERS with the biggest id OR 
creation date (whichever is easier to do) go here</ELEM> 
     <IMAGE> contents of <FILE> node go here</IMAGE> 
    </MYOBJ> 

Le principal problème que j'ai est que depuis que je suis nouveau à XSL (et pour cette tâche particulière n'ont pas assez de temps pour apprendre correctement) est que je ne peux pas comprendre comment dire au processeur XSL de ne rien traiter d'autre, je continue d'obtenir des sorties, par exemple.

Mise à jour: fondamentalement, j'ai résolu ce problème en attendant. Je vais poster ma propre réponse et fermer la question.

Update2: OK, la réponse d'Andrew fonctionne aussi, donc je l'accepte. :)

+0

-1. Stackoverflow n'est pas vraiment un endroit pour dire RTFM, mais vous demandez simplement à la communauté d'écrire du code pour vous que vous pourriez écrire si vous lisez la documentation disponible gratuitement. Alors, soyez précis - quel est votre problème? – Elijah

+0

Eh bien. J'ai lu la RTFM avant de venir ici, mais OK, assez juste ... Je vais vous expliquer plus. – Gnudiff

Répondre

2

Cette question a été formulée de façon très lâche et ce n'est pas utile pour fournir une solution plus significative.

Cela dit, la transformation ci-dessous:

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

    <xsl:template match="/"> 
     <MYOBJ> 
     <ELEM> 
      <xsl:for-each select="/*/AAA/OBJ/OBJVERS"> 
      <xsl:sort select="@CREATED" order="descending"/> 

      <xsl:if test="position() = 1"> 
       <xsl:copy-of select="."/> 
      </xsl:if> 
      </xsl:for-each> 
     </ELEM> 

     <IMAGE> 
      <xsl:copy-of select="/*/DDD/FILE"/> 
     </IMAGE> 
     </MYOBJ> 
    </xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document XML fourni artificiel et (qui, en fait, a une mauvaise structuration et de nommer et va à l'encontre de nombreux principes de conception des documents XML):

<DOC> 
    <AAA> 
     <STUFF>example</STUFF> 
     <OBJ> 
      <OBJVERS id="A1" CREATED="2008-02-18T13:28:08.245Z"/> 
      <OBJVERS id="A2" CREATED="2008-02-19T10:42:41.965Z"/> 
      <OBJVERS id="A13" CREATED="2009-03-16T12:43:11.703Z"/> 
     </OBJ> 
    </AAA> 
    <FFF/> 
    <GGG/> 
    <DDD> 
     <FILE /> 
    </DDD> 
</DOC> 

produit ce que l'on pourrait deviner le résultat recherché:

<MYOBJ> 
    <ELEM> 
     <OBJVERS id="A13" CREATED="2009-03-16T12:43:11.703Z"/> 
    </ELEM> 
    <IMAGE> 
     <FILE/> 
    </IMAGE> 
</MYOBJ> 
+0

Merci beaucoup pour votre temps et votre réponse. D'ailleurs, le XML artificiel est (assez simplifié, mais structurellement correct) de ce que produit Fedora Commons quand vous essayez d'exporter les objets numériques qu'il contient. – Gnudiff

+0

@Gnudiff Glad la réponse a été utile. Je ne peux pas croire que tout vocabulaire XML utile aura des éléments nommés "AAA", "DDD", "FFF" et "GGG". –

+0

@Dimitre: Non, le nom des balises AAA/BBB est à moi, c'est vrai, je voulais attirer l'attention sur la partie du document qui était pertinente, et j'ai récemment lu zvon.org qui utilise des balises comme ça dans leurs exemples, donc j'ai dérivé à la dérive. Cela est vrai, cependant, que les balises de version de OBJVERS ne sont pas des nombres simples, mais ont des préfixes alphanumériques pour une raison étrange. – Gnudiff

0

Ceci n'est pas la solution complète, en ce sens qu'il ne triera pas les OBJETS avant de sélectionner le premier. Mais si vous pouvez résoudre le problème de choisir les bons OBJVERS, alors je pense que cela fera le reste.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml"/> 
<xsl:template match="/"> 
    <MYOBJ> 
     <xsl:for-each select="/DOC/AAA/OBJ/OBJVERS[position()==1]"> 
      <ELEM><xsl:copy-of select="*"/></ELEM> 
     </xsl:for-each> 
     <IMAGE><xsl:copy-of select="/DOC/DDD/FILE/*" /></IMAGE> 
    </MYOBJ> 
</xsl:template> 
+0

Il n'y a pas d'opérateur "==" dans XPath. Tout processeur XSLT compatible génère une erreur même lors de la phase de compilation. Cette réponse ne résout pas le problème du tout. –