2010-12-02 65 views
0

Y at-il une commande XQuery pour charger un fichier texte?Comment charger un fichier texte depuis un XQuery?

Je peux charger un document XML en procédant comme suit;

declare variable $text := doc("test.xml"); 

Mais cela ne semble fonctionner que si test.xml est un document XML bien formé. Ce que je veux, c'est charger un fichier test.txt simple dans une variable de type chaîne. Quelque chose comme ça;

declare variable $str as xs:string := fn:loadfile("test.txt"); 

Peut-il être fait? J'utilise le moteur Saxon mais je ne trouve pas de réponse dans la documentation saxon.

+0

Je pense que la réponse est non avec une fonction standard. La fonction 'unparsed-text()' est une fonction uniquement XSLT. –

Répondre

1

Il y a un effort de normalisation pour cela sur EXPath. Une spécification existe déjà pour un module de fichier XQuery capable de faire ce que vous décrivez: EXPath File Module Spec.

Pourtant, je ne sais pas combien de mises en œuvre sont là. Saxon ne semble pas l'appliquer malheureusement (Ou, s'il vous plaît pointez-moi dessus). Un exemple d'implémentation est fourni avec zorba (voir XQDoc Site of Zorba). Si vous voulez savoir comment démarrer avec zorba, vous pouvez consulter ce tutoriel: Get Started with XQuery and Zorba.

2

XQuery 3.0 a la fonction fn:unparsed-text (qui a été défini à l'origine dans XSLT), qui fait exactement ce que vous voulez. XQuery 3.0 est encore un travail en cours, mais bien qu'il n'y ait pas beaucoup de processeurs XQuery 3.0 disponibles, de nombreux processeurs XQuery prennent déjà en charge cette fonction (y compris Saxon).

+0

Merci. Cela ressemble exactement à ce dont j'ai besoin, mais quand j'essaie de l'utiliser, je reçois une erreur "La fonction système # 1 n'est pas disponible avec cette langue hôte". La documentation de Saxon pour fn: unparsed-text() comporte une clause de non-responsabilité qui dit "L'implémentation de Saxon actuelle n'est pas stable: si la fonction est appelée deux fois avec le même argument, elle lira deux fois le fichier externe si cela a changé. " –

+0

Vous devriez dire que XQuery 3.0 est un brouillon de travail: même il y a quelques mois, il avait un numéro de version différent ... –

+0

@Alejandro - Bon point.J'ai fait ce changement. –

0

XQuery par défaut (signifie fn: namespace) n'a pas de méthodes d'accès aux fichiers.

MarkLogic: xdmp: système de fichiers-file() xdmp: système de fichiers répertoire()

Zorba: déjà mentionné par user457056

Existent Exist File Module

0

saxonne depuis la version 9.2 a une extension de fn: collection qui peut être utilisée pour lire du texte non analysé. Voici un exemple:

collection('file:///c:/TEMP?select=text.txt;unparsed=yes') 

Ceci est décrit sous la rubrique « Changes in this Release » pour 9,2. Apparemment, il n'est pas mentionné dans la documentation de la bibliothèque de fonctions. Cependant, cela fonctionne bien et je l'utilise beaucoup.