Sélectionnez à partir de l'intérieur d'un fileliste de xml
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>
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>