Función document
Proporciona un modo de recuperar otros recursos XML desde la hoja de estilos XSLT más allá de los datos iniciales proporcionados por el flujo de entrada.
node-set document(object, node-set?)
Comentarios
Los efectos de la función document() varían según el tipo y el número de argumentos suministrados.
Si solo se proporciona un argumento y dicho argumento es una cadena, document() trata la cadena como una dirección URL y recupera el documento como un conjunto de nodos.Para obtener un ejemplo de código, vea el Ejemplo 1 que aparece a continuación.
Si solo se proporciona un argumento y dicho argumento es un conjunto de nodos, cada nodo de ese conjunto de nodos será tratado como una dirección URL y la función devolverá la unión de todos los documentos a los que se ha hecho referencia.Para obtener un ejemplo de código, vea el Ejemplo 2 que aparece a continuación.
Si hay dos argumentos, el primero de ellos puede ser una cadena o un conjunto de nodos, mientras que el segundo debe ser un conjunto de nodos.El segundo argumento, cuando se suministra, sirve para indicar la dirección URL base con la que está relacionado el contenido del primer argumento.Para obtener un ejemplo de código, vea el Ejemplo 3 que aparece a continuación.
Si se pasa una cadena vacía a la función document(), el resultado es el XML de origen del documento XSLT, a menos que se proporcione el segundo argumento (y no sea nulo).En el último caso, la dirección URL del documento es la dirección URL base del nodo incluido en el segundo elemento.
Cuando se descarga un documento XML de una página ASP mediante la función document() con una dirección URL absoluta como argumento, debe establecerse la propiedad ServerHTTPRequest como true en el objeto DOM que contiene la hoja de estilos XSLT antes de que se inicie cualquier transformación, tal y como se muestra en el siguiente fragmento de código JScript:
xsltDom.setProperty("ServerHTTPRequest", true);
La razón para ello es que MSXML utiliza URLMON.dll como predeterminado para permitir la descarga de archivos.Sin embargo, ASP no admite URLMON.Por tanto, necesita establecer esta propiedad para elegir WinHTTP.dll como la alternativa para las descargas.
Ejemplo 1
En este ejemplo, la hoja de estilos XSLT (document.xsl) realiza los siguientes pasos:
Utiliza la función document() para descargar dos documentos XML (hrGroup.xml y myGroup.xml) mencionados en el documento XML de origen (document.xml).
Extrae los elementos <group> de los documentos descargados.
Inserta los elementos extraídos en el documento XML resultante.
El resultado de la transformación es resolver las referencias en document.xml.Cuando se utiliza una ruta relativa para hacer referencia al documento XML externo, la dirección URL base es la de la hoja de estilos XSLT.
Cuando se inicia la transformación desde un script de una página ASP (document.asp), se establece la propiedad ServerHTTPRequest como true.Esto no es necesario cuando se inicia la transformación en JScript (document.js) y se ejecuta dentro de Windows Scripting Host o una página HTML.En este caso se utiliza Windows Script Host.
Archivo XML (document.xml)
<?xml version='1.0'?>
<groups>
<groupRef href="https://localhost/hr/hrGroup.xml"/>
<groupRef href="myGroup.xml"/>
</groups>
Archivo XML 1 mencionado (hrGroup.xml)
<?xml version='1.0'?>
<group name="hr">
<leader>mo</leader>
<member>bo</member>
<member>ko</member>
<member>lo</member>
</group>
Archivo XML 2 mencionado (myGroup.xml)
<?xml version='1.0'?>
<group name="my">
<leader>john</leader>
<member>jane</member>
<member>jon</member>
<member>jan</member>
</group>
Archivo 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>
Archivo 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));
%>
Archivo 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));
¡Inténtelo!
Copie las muestras de códigos anteriores y péguelas en archivos en su disco local.
Guarde los archivos con los nombres y las extensiones proporcionadas.
Cree un nuevo directorio virtual, con el alias hr, bajo la página web predeterminada de su equipo local.Si utiliza un equipo remoto como servidor web, cambie localhost al nombre de host del servidor web del valor del atributo href de document.xml.Si utiliza un directorio virtual existente, cambie hr del mismo valor de atributo href a cualquier alias que tenga el directorio.Mueva el archivo hrGroup.xml al directorio que se haya convertido en el directorio virtual del servidor web.
Abra la página ASP desde una ventana de explorador Internet Explorer con la siguiente dirección URL:
https://localhost/hr/document.asp
Ejecute el archivo JScript utilizando el siguiente comando de Windows Scripting Host:
cscript document.js
Resultados
A continuación se muestra el resultado del procesador, al que se han añadido sangrías por razones de claridad.
<?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>
Ejemplo 2
Este ejemplo muestra las consecuencias de utilizar un conjunto de nodos como el argumento para la función document.
Archivo 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>
Hoja de estilos 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>
¡Inténtelo!
Descargue msxsl.exe de msdn.microsoft.com, si no lo ha hecho aún.
En el símbolo del sistema, escriba el siguiente comando desde el directorio en el que ha guardado document1.xml y document1.xsl:
msxsl document1.xml document1.xsl
Resultados
El resultado es parecido al resultado obtenido en el Ejemplo 1 anterior.
Ejemplo 3
Este ejemplo muestra las consecuencias de utilizar dos argumentos al llamar a la función document.El segundo argumento, que debe ser un conjunto de nodos, sirve como la dirección URL base para el primer argumento.Cuando no aparece el segundo argumento, la dirección URL base del primer argumento es la dirección URL base del archivo XSLT.
Hoja de estilos 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>
Archivo XML 1 (b.xml)
<doc>
<a> one </a>
<a> two </a>
<a> three </a>
</doc>
Archivo XML 2 (subDir/a.xml)
<doc>
<a> I </a>
<a> II </a>
<a> III </a>
</doc>
¡Inténtelo!
Guarde document2.xsl y b.xml en un directorio de trabajo.
En el símbolo del sistema escriba el siguiente comando en el directorio de trabajo:
msxsl.exe a.xml document2.xsl
Resultados
<?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>