Question

Je utiliser xslt 2.0 pour transformer des données xml en fichiers xml.J'ai créé xsl pour trouver tous les fichiers dans un dossier, ce qui a bien fonctionné:

filenames.xml

<?xml version="1.0" encoding="UTF-8"?>
<filelist>
   <file>birds2014.xml</file>
   <file>birds2013.xml</file>
</filelist>

Puis j'ai créé un xsl pour effectuer une recherche dans les fichiers xml pour sélectionner tous les noms d'oiseaux qui sont situés dans la balise <spbird> dans tous les documents.

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

<xsl:template match="*">
        <xsl:apply-templates/> 
        <xsl:variable name="files" select="document('filelist.xml')/filelist/file"/>
            <xsl:element name="birdname">
                <xsl:for-each select="document($files)">    
                    <xsl:value-of select="//spbird">
                    </xsl:value-of>
                </xsl:for-each>
            </xsl:element>  
    </xsl:template>

Résultat:

<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>

Prévu:

<birdname>Papagei</birdname>
<birdname>Wellensittich</birdname>
<birdname>Pfau</birdname>

Quelqu'un peut-il aider?

Modifier J'ai changé le

 <xsl:template match="*">

pour

   <xsl:template match="/">

ce qui résout le problème de la même résultat montrant jusqu'à 9 fois (d'où ce nombre vient).

Maintenant, avec votre aide, le résultat est:

<birdname>Papagei Wellensittich</birdname>
<birdname>Pfau</birdname>

Pfau est l'oiseau dans le deuxième fichier xml.Le seul problème est, que le document() semble ne pour-chacun sur son propre.Donc je ne reçois pas tous les oiseaux répertoriés séparément dans un birdname tag..

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

<xsl:template match="*">
        <xsl:apply-templates/> 
        <xsl:variable name="files" select="document('filelist.xml')/filelist/file"/>

                <xsl:for-each select="document($files)">   
                       <birdname> 
                         <xsl:value-of select="//spbird">
                       </birdname>
                    </xsl:value-of>
                </xsl:for-each>
            </xsl:element>  
    </xsl:template>
Était-ce utile?

La solution

Essayez de mettre votre élément à l'intérieur de la xsl:for-each...

<xsl:for-each select="document($files)">    
    <birdname>
        <xsl:value-of select="//spbird"/>            
    </birdname>
</xsl:for-each>

Note:Sauf si vous essayez de créer dynamiquement le nom de l'élément, il n'y a pas de raison de les utiliser xsl:element.

Modifier

XSLT 2.0, xsl:value-of vous donnera toutes les valeurs de spbird.Au lieu d'un xsl:for-each sur le document, vous devez le faire pour chaque sur le spbird.Essayez de changer votre xsl:for-each pour l'exemple ci-dessous.Si cela ne fonctionne pas, s'il vous plaît ajouter un exemple de l'oiseau fichiers à votre question.

<xsl:for-each select="document($files)//spbird">    
    <birdname>
        <xsl:value-of select="."/>            
    </birdname>
</xsl:for-each>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top