Seleziona da un FileListe di XML
Domanda
Io uso XSLT 2.0 per trasformare i dati XML in file XML. Ho creato XSL per trovare tutti i file dei file in una cartella, che funzionava bene:
filenames.xml
<?xml version="1.0" encoding="UTF-8"?>
<filelist>
<file>birds2014.xml</file>
<file>birds2013.xml</file>
</filelist>
.
Quindi ho creato una XSL per cercare all'interno dei file XML per selezionare tutti i nomi degli uccelli che si trovano nel tag <spbird>
in tutti i documenti.
<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>
.
Risultato:
<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>
.
Previsto:
<birdname>Papagei</birdname>
<birdname>Wellensittich</birdname>
<birdname>Pfau</birdname>
.
Qualcuno può aiutare?
Modifica Ho cambiato il
<xsl:template match="*">
.
a
<xsl:template match="/">
.
che risolve il problema dello stesso risultato che mostra 9 volte (da dove è venuto questo numero).
Ora con il tuo aiuto il risultato è:
<birdname>Papagei Wellensittich</birdname>
<birdname>Pfau</birdname>
.
Pfau
è l'uccello nel secondo file XML.
Solo il problema è che il documento () sembra fare un per-ciascuno su è proprio.Quindi non ottengo tutti gli uccelli elencati separatamente in un tag Birdname ..
<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>
. Soluzione
Prova a mettere il tuo elemento all'interno del xsl:for-each
...
<xsl:for-each select="document($files)">
<birdname>
<xsl:value-of select="//spbird"/>
</birdname>
</xsl:for-each>
.
Nota: a meno che tu non stia cercando di costruire dinamicamente il nome dell'elemento, non c'è motivo di usare xsl:element
.
Modifica
In XSLT 2.0, xsl:value-of
ti darà ogni valore di spbird
.Invece di un xsl:for-each
sul documento, dovresti fare il per-ciascuno sul spbird
.Prova a cambiare il tuo xsl:for-each
nell'esempio seguente.Se ciò non funziona, aggiungi un esempio dei file dell'uccello alla tua domanda.
<xsl:for-each select="document($files)//spbird">
<birdname>
<xsl:value-of select="."/>
</birdname>
</xsl:for-each>
.