web-dev-qa-db-fra.com

Inclusion d'un fichier XML dans un fichier XML/XSL

Donc, actuellement, je travaille avec XML-> XSLT-> (HTML5/CSS3). À l’heure actuelle, j’ai un fichier menu.xml et j’aimerais l’inclure dans le fichier XSL ou dans la page XML. J'ai fait beaucoup de recherches, mais je suis incapable de trouver une réponse simple.

Alors, comment puis-je inclure un fichier XML dans un autre fichier XML ou dans un fichier XSL?

Edit: Par inclusion, je veux dire le référencer/le charger à partir d’un autre fichier, pas le copier/coller, ni simplement l’incorporer.

23
Jookia

I. Voici comment tout document ou fragment XML peut être incorporé dans une feuille de style XSLT et utilisé lors de la transformation:

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

Lorsque cette transformation est appliquée à un document XML (non utilisé dans cet exemple), le résultat souhaité (en copiant simplement le XML) est généré:

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

Remember: tout XML peut être incorporé dans une feuille de style XSLT, à condition qu'il soit encapsulé dans un élément d'espacement de nom (l'espace de nom, pas l'espace de nom XSLT) et que cet élément d'habillage se trouve au niveau global (un enfant du <xsl:stylesheet> (haut) élément).

II. Accéder au fichier de menu XML qui réside dans un fichier XML séparé:

Pour ce faire, nous ne devons modifier que légèrement l'exemple précédent:

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

Si le fichier XML de menu est dans le fichier 'menu.XML' (dans le même répertoire que le fichier de feuille de style XSLT, cette transformation produit exactement le même résultat que la précédente:

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

Do note: Dans les deux cas, nous utilisons la fonction XSLT standard document()

Généralement, on définit une variable de niveau global dont la valeur est le résultat de l’appel de la fonction document(). Ensuite, cette variable et son contenu sont accessibles via des expressions XPath lors de la transformation.

35
Dimitre Novatchev

Alors, comment puis-je inclure un fichier XML dans un autre fichier XML ou dans un fichier XSL?

Vous pouvez utiliser une entité externe pour référencer le fichier menu.xml et inclure le contenu dans un fichier XML ou dans le XSLT (ou les deux).

Par inclusion, je veux dire référencement/chargement à partir d'un autre fichier, pas copier et en le collant ou tout simplement en l'incrustant.

En utilisant des entités externes, vous pouvez référencer/charger le contenu menu.xml à partir de fichiers externes sans avoir à dupliquer le contenu XML.

Par exemple, si vous vouliez que le contenu menu.xml soit inclus dans votre XSLT, vous déclareriez l'entité externe dans votre XSLT comme suit:

<?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">

et pourrait ensuite le référencer comme n'importe quelle autre entité:

&menu;

Lorsque le fichier XSLT sera analysé, la référence de l'entité sera développée et le contenu XML du fichier menu.xml sera inclus dans le document XSLT comme si vous aviez copié/collé à l'emplacement de la référence de l'entité.

5
Mads Hansen

Je n'ai pas pu obtenir le code que les gens ont fourni. Cependant, j'ai eu une solution après avoir essayé plusieurs choses. Nommez un fichier xml clGroup.xml (les deux premières lettres importent peu, mais je constate que "Groupe" est requis. Ce fichier xml référencera le code xml que vous souhaitez analyser. 

clGroup xml:

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

Maintenant, nommez un fichier caGroup.xml et insérez le code suivant:

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

Maintenant, voici mon fichier XSLT 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>

L'avantage de configurer mon code de cette façon est que je peux facilement créer le fichier XML à partir d'un fichier Excel et non à moitié pour insérer une déclaration dans le fichier nouvellement créé. Vous devez avoir le format "xxGroup" pour que cela fonctionne ensemble. Vous pouvez ajouter plus de groupes au fichier clGroup. Ils seront analysés dans XSLT, ce qui vous permettra d'inclure plus de XML dans le même analyseur XSLT. Assurez-vous qu'ils sont tous dans le même répertoire. 

1
Cody

J'ai un article de blog à ce sujet. Vous utilisez document () pour obtenir l'autre code XML et transmettre le contenu à l'aide de paramètres.

1
PaulMurrayCbr

Si incorporer simplement le fichier dans le fichier XML n’est pas une solution, vous devez ajouter un champ d’URL que le programme d’interprétation lit. dans un fichier XML.

Donc, puisque vous écrivez le programme qui interprète le fichier, vous pouvez ajouter une balise <externalMenuTagThatYouDecideToAddToTheBaseXmlFile> ou le nom de votre choix pour lire et insérer la note fondamentale de menu.xml à la place du <externalMenuTagThatYouDecideToAddToTheBaseXmlFile>.

Bonne chance et que vos programmes soient toujours compilés.

0
Yzmir Ramirez