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>
.

È stato utile?

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>
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top