2011-01-16 19 views
22

Così attualmente sto facendo del lavoro XML-> XSLT-> (HTML5/CSS3). In questo momento ho un file menu.xml e mi piacerebbe includerlo nel file XSL o nella pagina XML. Ho fatto molte ricerche, ma non sono in grado di trovare una risposta semplice.Incluso un file XML in un file XML/XSL

Quindi, come posso includere un file XML in un altro file XML o in un file XSL?

Modifica: da includere, intendo riferimento/caricamento da un altro file, non copia e incollarlo o semplicemente incorporarlo.

+0

Con "includi", vuoi dire che vuoi copiare/incollare il contenuto di menu.xml in un altro file e ospitarlo lì senza problemi, o intendi che vuoi in qualche modo accedere al menu di riferimento remoto. xml dal file host, o intendi che vuoi che il tuo server web copi il contenuto di menu.xml nel file host prima di servirlo, come se tu avessi copiato/incollato i contenuti da solo? – Phrogz

+0

Ah, in un certo senso intendevo riferirlo dal file, escludendolo. Accidenti la mia programmazione parla. Anch'io uso per C. – Jookia

+1

Buona domanda, +1. Vedi la mia risposta per la spiegazione e due esempi di codice completi che rispondono alle tue domande. :) –

risposta

33

I. Ecco come qualsiasi documento XML o frammento possono essere incorporati in un foglio di stile XSLT e utilizzati durante la trasformazione:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<my:menu> 
    <menu> 
    <choice>A</choice> 
    <choice>B</choice> 
    <choice>C</choice> 
    </menu> 
</my:menu> 

<xsl:template match="/"> 
    <xsl:copy-of select="document('')/*/my:menu/*"/> 
</xsl:template> 
</xsl:stylesheet> 

Quando questa trasformazione viene applicato su qualsiasi documento XML (non usato in questo esempio), il risultato voluto (semplicemente copiando il codice XML) è prodotto:

<menu xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my"> 
    <choice>A</choice> 
    <choice>B</choice> 
    <choice>C</choice> 
</menu> 

Ricorda: Qualsiasi XM L può essere incorporato in un foglio di stile XSLT, a condizione che sia racchiuso in un elemento con spazio dei nomi (lo spazio dei nomi non è lo spazio dei nomi XSLT) e questo elemento di spostamento è a livello globale (un elemento figlio dell'elemento <xsl:stylesheet> (superiore)).

II. Accesso al file di menu XML che risiede in un file XML separato:

Per fare questo dobbiamo cambiare solo leggermente l'esempio precedente:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 


<xsl:template match="/"> 
    <xsl:copy-of select="document('menu.XML')/*"/> 
</xsl:template> 
</xsl:stylesheet> 

Se il file di menu XML è nel file 'menu.XML' (nella stessa directory del file fogli di stile XSLT, allora questa trasformazione produce esattamente lo stesso risultato come il precedente:

<menu> 
    <choice>A</choice> 
    <choice>B</choice> 
    <choice>C</choice> 
</menu> 

Do no TE: In entrambi i casi stiamo usando la funzione XSLT norma document()

Tipicamente, si definisce una variabile a livello globale, il cui valore è il risultato della chiamata della funzione document(). Quindi questa variabile e il suo contenuto sono accessibili tramite espressioni XPath durante la trasformazione.

+0

È possibile applicare modelli anche nel documento incluso (menu.xml), proprio come qualsiasi altro elemento? –

+3

@ acido lisergico: Sì, perché pensi che questo non sia possibile? Basta provare '' o qualunque cosa ti piaccia per vedere che questo funziona come dovrebbe. –

0

Se semplicemente l'incorporamento del file all'interno del file XML non è una soluzione, allora aggiungere un campo url che il programma di interpretariato legge dovrebbe essere aggiunto- fondamentalmente si sta richiedendo l'equivalente di un include (menu.xml) o richiesto (xml), ma in un file XML.

Quindi, dal momento che si sta scrivendo il programma che è intepretting il file è possibile aggiungere un tag <externalMenuTagThatYouDecideToAddToTheBaseXmlFile> o come volete chiamarlo così potrete leggere e inserire nota fondamentale di menu.xml il posto del <externalMenuTagThatYouDecideToAddToTheBaseXmlFile>.

Buona fortuna e possono i vostri programmi compilare sempre.

+1

Non sto davvero scrivendo un interprete, sto scrivendo un sito web. > _> – Jookia

5

Quindi, come posso includere un file XML in un altro file XML o in un file XSL?

È possibile utilizzare un external entity a riferimento il menu.xml file di e comprendono il contenuto in entrambi un file XML o XSLT (o entrambi).

Con includono, intendo riferimento/carico da un altro file, non copiare e incollare o semplicemente incorporarlo.

Utilizzando entità esterne, è possibile fare riferimento/caricare il menu.xml contenuti da file esterni e non c'è bisogno di duplicare il contenuto XML.

Per esempio, se si voleva il contenuto menu.xml incluso nel vostro XSLT, si dovrebbe dichiarare l'entità esterna nel vostro XSLT come questo:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE stylesheet [ 
    <!ENTITY menu SYSTEM "./menu.xml"> 
]> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

e potrebbe quindi fare riferimento, come si farebbe con qualsiasi altra entità :

&menu; 

Quando il XSLT analizzato, il riferimento all'entità sarà ampliato e il contenuto XML del menu.xml sarà incluso come parte del documento XSLT come se si fosse copia/incollato nel punto in cui l'entità riferimento era.

+0

Non è una cattiva risposta, ma questo non è * "referenziamento/caricamento" * ma sostituzione nella sintassi di superficie più rara che nell'astrazione logica. –

+1

il wrapping &menu; in un oggetto locale consentirebbe l'utilizzo di xpaths all'interno del menu xml all'interno di xslt. es: &menu; e quindi sandeepkunkunuru

1

Ho a blog post su questo. Si usa document() per ottenere l'altro XML e passare il contenuto usando i parametri.

1

Non sono riuscito a far funzionare il codice fornito dalle persone. Tuttavia ho avuto una soluzione dopo aver provato diverse cose. Nome di un file XML clGroup.xml (prime due lettere non contano, ma mi sto trovando "Gruppo" è richiesto Questo file XML farà riferimento l'XML che si desidera analizzare

clGroup xml:..

<?xml version='1.0' encoding="UTF-8" ?> 
<?xml-stylesheet type="text/xsl" href="calendarGroup.xslt" ?> 
<groups> 
    <groupRef>caGroup.xml</groupRef> 
</groups> 

Ora nome a un file caGroup.xml e mettere nel codice seguente:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<topics xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <topic> 
     <topicstopic>Calendar</topicstopic> 
     <topicsubmitter>Calendar</topicsubmitter> 
     <creatoremail>[email protected]</creatoremail> 
    </topic> 
    <topic> 
     <name>Week1</name> 
     <sunday/> 
     <monday/> 
     <tuesday>Test01 Young Men Weekly</tuesday> 
     <wednesday>02 Elders Home Teaching Message Birthday</wednesday> 
     <thursday>03 </thursday> 
     <friday>04 </friday> 
     <saturday>05 #Young Men Weekly</saturday> 
    </topic> 
    <topic> 
     <name>Week2</name> 
     <sunday>06 Fast Sunday</sunday> 
     <monday>07 FHE</monday> 
     <tuesday>08 Young Men Tonight #Young Men Weekly going to Bishops storehouse 6PM to 7PM Young Men Weekly</tuesday> 
     <wednesday>09 </wednesday> 
     <thursday>10 Scout Round Table at 7 PM </thursday> 
     <friday>11 </friday> 
     <saturday>12 </saturday> 
    </topic> 
    </topics> 

Ora qui è la mia XSLT file di calendarGroup.xslt

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="html" 
      version="1.0" 
      encoding="UTF-8" 
      indent="yes"/> 

<xsl:template match="groups/groupRef"> 
    <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>Table</title> 
     <meta charset="utf-8" /> 
    </head> 
    <body> 
     <table border="1"> 
     <tr> 
      <th>Sunday</th> 
      <th>Monday</th> 
      <th>Tuesday</th> 
      <th>Wednesday</th> 
      <th>Thursday</th> 
      <th>Friday</th> 
      <th>Saturday</th> 
     </tr>   
     <xsl:for-each select="document(.)//topic"> 
      <xsl:if test="string(name) != ''"> 
      <tr> 
      <td> 
       <xsl:value-of select="sunday"/> 
      </td> 
      <td> 
       <xsl:value-of select="monday"/> 
      </td> 
      <td> 
       <xsl:value-of select="tuesday"/> 
      </td> 
      <td> 
       <xsl:value-of select="wednesday"/> 
      </td> 
      <td> 
       <xsl:value-of select="thursday"/> 
      </td> 
      <td> 
       <xsl:value-of select="friday"/> 
      </td> 
      <td> 
       <xsl:value-of select="saturday"/> 
      </td> 
      </tr> 
      </xsl:if> 
     </xsl:for-each> 
     </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

Il vantaggio di impostare il mio codice in questo modo è che posso creare facilmente l'xml da un file excel e non la metà da inserire in una dichiarazione nel nuovo file creato. È necessario che il formato "xxGroup" funzioni correttamente. È possibile aggiungere più gruppi al file clGroup e questi verranno analizzati in XSLT consentendo di includere più xml nello stesso parser XSLT. Assicurati che siano tutti nella stessa directory.

+0

Non c'è magia nella stringa "Gruppo "- puoi usare tutti i nomi che ti piacciono. –

+0

Grazie! È strano perché quando cambio i nomi fuori dal testo non funziona per qualche ragione per me. La cosa bella che vedo è che puoi aggiungere diversi file XML al raggruppamento e li analizzerà. – Cody

Problemi correlati