Fonction document
Offre une façon de récupérer d'autres ressources XML depuis la feuille de style XSLT au-delà des données initiales fournies par le flux d'entrée.
node-set document(object, node-set?)
Notes
Les effets de la fonction document() varient selon le type et le nombre d'arguments fournis.
Si un seul argument est fourni et correspond à une chaîne, document() traite la chaîne comme une URL et récupère le document sous la forme d'une collection de nœuds. Voir l'exemple 1 ci-dessous pour une illustration de code.
Si, un seul argument est fourni et correspond à une collection de nœuds, chaque nœud de cette collection est traité comme une URL et la fonction retourne l'union de tous les documents référencés. Voir l'exemple 2 ci-dessous pour une illustration de code.
Si deux arguments sont fournis, le premier peut être une chaîne ou une collection de nœuds tandis que le second doit être une collection de nœuds. Le second argument, si fourni, permet d'indiquer l'URL de base à laquelle le contenu du premier argument se rapporte. Voir l'exemple 3 ci-dessous pour une illustration de code.
Si une chaîne vide est transmise à la fonction document(), le résultat est le XML source du document XSLT proprement dit, sauf si le second argument est donné (et non nul). Dans ce cas, l'URL du document correspond à l'URL de base du nœud contenu dans le deuxième élément.
Si un document XML est téléchargé depuis une page ASP à l'aide de la fonction document() avec une URL absolue comme argument, la propriété ServerHTTPRequest doit être définie sur true dans l'objet DOM contenant la feuille de style XSLT avant le début de toute transformation, comme indiqué dans le fragment de code JScript suivant :
xsltDom.setProperty("ServerHTTPRequest", true);
En effet, MSXML utilise par défaut URLMON.dll pour la prise en charge du téléchargement de fichiers. Toutefois, ASP ne prend pas URLMON en charge. Par conséquent, vous devez définir cette propriété pour choisir WinHTTP.dll comme alternative pour les téléchargements.
Exemple 1
Dans cet exemple, la feuille de style XSLT (document.xsl) effectue les opérations suivantes :
Elle utilise la fonction document() pour télécharger deux documents XML (hrGroup.xml et myGroup.xml) auxquels le document XML source (document.xml) fait référence.
Elle extrait les éléments <group> des documents téléchargés.
Elle insère les éléments extraits dans le document XML résultant.
L'effet de la transformation réside dans la résolution des références dans document.xml. Si un chemin d'accès relatif permet de faire référence au document XML externe, l'URL de base est celle de la feuille de style XSLT.
Si la transformation est commencée par un script dans une page ASP (document.asp), la propriété ServerHTTPRequest est définie sur true. Ceci n'est pas nécessaire si la transformation est commencée dans JScript (document.js) et exécutée dans l'hôte de script Windows ou une page HTML. Dans ce cas, l'hôte de script Windows est utilisé.
Fichier XML (document.xml)
<?xml version='1.0'?>
<groups>
<groupRef href="https://localhost/hr/hrGroup.xml"/>
<groupRef href="myGroup.xml"/>
</groups>
Fichier XML 1 référencé (hrGroup.xml)
<?xml version='1.0'?>
<group name="hr">
<leader>mo</leader>
<member>bo</member>
<member>ko</member>
<member>lo</member>
</group>
Fichier XML 2 référencé (myGroup.xml)
<?xml version='1.0'?>
<group name="my">
<leader>john</leader>
<member>jane</member>
<member>jon</member>
<member>jan</member>
</group>
Fichier XSLT (document.xsl)
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<groups>
<xsl:apply-templates select="//groupRef"/>
</groups>
</xsl:template>
<xsl:template match="groupRef">
<xsl:copy-of select="document(@href)//group"/>
</xsl:template>
</xsl:stylesheet>
Fichier ASP (document.asp)
<%@ LANGUAGE = JScript %>
<%
// Set the source and style sheet locations here.
var sourceFile = Server.MapPath("document.xml");
var styleFile = Server.MapPath("document.xsl");
// Load the XML.
var source = Server.CreateObject("Msxml2.DOMDocument.6.0");
source.setProperty("AllowDocumentFunction", true);
source.async = false;
source.load(sourceFile);
// Load the XSLT.
var style = Server.CreateObject("Msxml2.DOMDocument.6.0");
style.setProperty("AllowDocumentFunction", true);
style.async = false;
style.setProperty("ServerHTTPRequest", true);
style.load(styleFile);
Response.Write(source.transformNode(style));
%>
Fichier JScript (document.js)
// Set the source and style sheet locations here.
var sourceFile = ("document.xml");
var styleFile = ("document.xsl");
// Load the XML.
var source = new ActiveXObject("Msxml2.DOMDocument.6.0");
source.setProperty("AllowDocumentFunction", true);
source.async = false;
source.load(sourceFile);
// Load the XSLT.
var style =new ActiveXObject("Msxml2.DOMDocument.6.0");
style.setProperty("AllowDocumentFunction", true);
style.async = false;
style.load(styleFile);
WScript.Echo(source.transformNode(style));
Essayez !
Copiez les exemples de code ci-dessus et collez-les dans les fichiers sur votre disque local.
Enregistrez les fichiers avec les noms et extensions fournis.
Créez un nouveau répertoire virtuel appelé hr sous le site Web par défaut de votre ordinateur local. Si vous utilisez un ordinateur distant comme serveur Web, remplacez localhost par le nom d'hôte du serveur Web dans la valeur de l'attribut href dans document.xml. Si vous utilisez un répertoire virtuel existant, remplacez hr dans le même attribut href par n'importe quel alias du répertoire. Déplacez le fichier hrGroup.xml dans le répertoire devenu le répertoire virtuel du serveur Web.
Ouvrez la page ASP à partir d'une fenêtre de navigateur Internet Explorer avec l'URL suivante :
https://localhost/hr/document.asp
Exécutez le fichier JScript à l'aide de la commande de l'hôte de script Windows suivante :
cscript document.js
Sortie
Voici les données en sortie du processeur ; un retrait a été ajouté pour plus de clarté.
<?xml version="1.0"?>
<groups>
<group name="hr">
<leader>mo</leader>
<member>bo</member>
<member>ko</member>
<member>lo</member>
</group>
<group name="my">
<leader>john</leader>
<member>jane</member>
<member>jon</member>
<member>jan</member>
</group>
</groups>
Exemple 2
Cet exemple illustre les effets de l'utilisation d'une collection de nœuds comme argument pour la fonction document.
Fichier XML (document1.xml)
<?xml version='1.0' encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="document1.xsl" ?>
<groups>
<groupRef>hrGroup.xml</groupRef>
<groupRef>myGroup.xml</groupRef>
</groups>
Feuille de style XSLT (document1.xsl)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"
version="1.0"
encoding="UTF-8"
indent="yes"/>
<xsl:template match="/">
<groups>
<xsl:apply-templates select="/groups/groupRef"/>
</groups>
</xsl:template>
<xsl:template match="groups/groupRef">
<xsl:copy-of select="document(.)//group"/>
</xsl:template>
</xsl:stylesheet>
Essayez !
Téléchargez msxsl.exe à partir de msdn.microsoft.com si ce n'est déjà fait.
À l'invite de commande, entrez la commande suivante à partir du répertoire où vous avez enregistré document1.xml et document1.xsl :
msxsl document1.xml document1.xsl
Sortie
La sortie est similaire à la sortie produite dans l'exemple 1 ci-dessus.
Exemple 3
Cet exemple illustre les effets de l'utilisation de deux arguments lors de l'appel de la fonction document. Le second argument, qui doit être une collection de nœuds, sert d'URL de base pour le premier argument. En cas d'absence du second argument, l'URL de base du premier constitue l'URL de base du fichier XSLT.
Feuille de style XSLT (document2.xsl)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<root>
<xsl:comment>One Argument </xsl:comment>
<xsl:for-each select="document('b.xml')//a">
<xsl:copy-of select="."/>
</xsl:for-each>
<xsl:comment>Two Argument </xsl:comment>
<xsl:for-each select="document('a.xml', .)//a">
<xsl:copy-of select="."/>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
Fichier XML 1 (b.xml)
<doc>
<a> one </a>
<a> two </a>
<a> three </a>
</doc>
Fichier XML 2 (subDir/a.xml)
<doc>
<a> I </a>
<a> II </a>
<a> III </a>
</doc>
Essayez !
Enregistrez document2.xsl et b.xml dans un répertoire de travail.
À l'invite de commande, entrez la commande suivante dans le répertoire de travail :
msxsl.exe a.xml document2.xsl
Sortie
<?xml version="1.0" encoding="UTF-8"?>
<root>
<!-- One Argument >
<a> one </a>
<a> two </a>
<a> three </a>
<!-- Two Arguments >
<a> I </a>
<a> II </a>
<a> III </a>
</root>