2009-07-08 13 views
0

Voici mon XML d'entrée:Comment filtrer un XML via XSLT avec xml params

<Books> 
    <Book> 
    <BookId>1</BookId> 
    <Des>Dumm1</Des> 
    <Comments/> 
    <OrderDateTime>04/06/2009 12:37</OrderDateTime> 
    </Book> 
    <Book> 
    <BookId>2</BookId> 
    <Des>Dummy2</Des> 
    <Comments/> 
    <OrderDateTime>04/07/2009 12:37</OrderDateTime> 
    </Book> 
    <Book> 
    <BookId>3</BookId> 
    <Des>Dumm12</Des> 
    <Comments/> 
    <OrderDateTime>05/06/2009 12:37</OrderDateTime> 
    </Book> 
    <Book> 
    <BookId>4</BookId> 
    <Des>Dummy2</Des> 
    <Comments/> 
    <OrderDateTime>06/07/2009 12:37</OrderDateTime> 
    </Book> 
</Books> 

Je passe un param XML et mon XML d'entrée est

<BookIDs> 
    <BookID>2</BookID> 
    <BookID>3</BookID> 
</BookIDs> 

Ma sortie devrait être comme

<Books> 
    <Book> 
    <BookId>2</BookId> 
    <Des>Dummy2</Des> 
    <Comments/> 
    <OrderDateTime>04/07/2009 12:37</OrderDateTime> 
    </Book> 
    <Book> 
    <BookId>3</BookId> 
    <Des>Dumm12</Des> 
    <Comments/> 
    <OrderDateTime>05/06/2009 12:37</OrderDateTime> 
    </Book> 
</Books> 

Comment j'accomplis cela en utilisant XSLT?

+0

Pouvez-vous poster votre tentative en premier, s'il vous plaît? –

+0

lol nota travail à domicile. – Greens

Répondre

0

Cela fonctionne à Saxon 6.5.5 ...

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1"> 
    <xsl:param name="nodeset"> 
     <BookIDs><BookID>2</BookID><BookID>3</BookID></BookIDs> 
    </xsl:param> 

    <xsl:template match="/Books"> 
     <Books> 
      <xsl:variable name="Copy"> 
       <wrap> 
        <xsl:copy-of select="Book"/> 
       </wrap> 
      </xsl:variable> 
      <xsl:for-each select="$nodeset/BookIDs/BookID"> 
       <xsl:copy-of select="$Copy/wrap/Book[BookId=current()]"/> 
      </xsl:for-each> 
     </Books> 
    </xsl:template> 
</xsl:stylesheet> 

Une solution XSLT pur sera assez fragile bien. Les prédicats de sous-requête n'ont pas fonctionné, pas plus que les clés. Cela dépend de la reconnaissance du param comme un ensemble de nœuds - ce que je n'ai pas réussi à obtenir avec une valeur dynamique (par opposition à la valeur par défaut dans mon exemple), même avec exsl:node-set. C'est aussi un gaspillage en ce sens qu'il copie tous les éléments du livre du document source.

Il existe peut-être une meilleure solution dans XSLT 2.0. Alternativement, si vous initiez votre transformation avec un autre langage/outil, il peut y avoir de meilleures approches disponibles. Une autre possibilité pourrait inclure l'utilisation de exsl:document pour charger votre document source ou params.