2017-09-18 2 views
1

En raison de certains problèmes avec la version php de Saxon, j'ai actuellement une configuration compliquée où je fais un appel PHP pour exécuter une commande java, convertir les résultats en HTML, afficher ce HTML sur ma page, puis supprimer le html résultant après l'affichage. Je peux fournir un lien vers la page si elle aide, mais le fichier .xq réelle est assez simpliste:Can Saxon fonctionne sur une page avec .htaccess?

xquery version "1.0" encoding "UTF-8"; 

declare namespace tei="http://www.tei-c.org/ns/1.0"; 

declare variable $zone external; 
declare variable $line external; 
declare variable $collection external; 

declare function local:if-empty 
    ($arg as item()? , 
    $value as item()*) as item()* { 

    if (string($arg) != '') 
    then data($arg) 
    else $value 
}; 

declare function local:remove-elements($input as element(), $remove-names as xs:string*) as element() { 
    element {node-name($input) } 
     {$input/@*, 
     for $child in $input/node()[not(name(.)=$remove-names)] 
      return 
      if ($child instance of element()) 
       then local:remove-elements($child, $remove-names) 
       else $child 
     } 
}; 

declare function local:remove-empty-elements($nodes as node()*) as node()* { 
    for $node in $nodes 
    return 
    if (empty($node)) then() else 
    if ($node instance of element()) 
    then if (normalize-space($node) = '') 
      then() 
      else element { node-name($node)} 
       { $node/@*, 
        local:remove-empty-elements($node/node())} 
    else if ($node instance of document-node()) 
    then local:remove-empty-elements($node/node()) 
    else $node 
} ; 

<list> 
{ 
let $q:=collection($collection) 
let $remove-list := ('note') 

(:let $q:=local:remove-empty-elements($q):) 

for $y in $q 
let $s := $y//tei:surface 
let $t := $y//tei:titleStmt/@xml:id 
let $m := $y//tei:msDesc/@xml:id 
let $z := $s/tei:zone[@n=$zone] 
let $l := $z/tei:line[@n=$line] 
let $w := concat($y//tei:msDesc/tei:msIdentifier/tei:settlement/text(),', ',$y//tei:msDesc/tei:msIdentifier/tei:institution/text(),' ',$y//tei:msDesc/tei:msIdentifier/tei:idno/text()) 
let $g := concat($t, "/" , $m, "/", substring-before($l/../../tei:graphic/@url,"."),".html") 
let $o:=local:remove-elements($l/tei:orig,$remove-list) 
where ($z//tei:line/@n = "l.1") 


return 

<item>{$w}: <ref target="{$g}">{$o}</ref></item>} 
</list> 

et la commande pour l'exécuter est java -Xms128m -Xmx1024m -XX:+UseCompressedOops -cp saxon9he.jar net.sf.saxon.Query -t -q:test.xq -o:1505740041.41932650059544.xml line=l.4 zone=EETS.QD.8 collection=file:<filefolder>

Mon problème est que les fichiers xml I » Je travaille avec des transcriptions actuellement non publiées, et je voudrais les garder derrière un dossier protégé par mot de passe jusqu'à ce que je pense qu'ils sont prêts pour le prime time. Si j'ai toute sorte de fichier .htaccess dans l'emplacement filefolder, je reçois le message d'erreur suivant:

Building tree for file:<filefolder>/.htaccess using class net.sf.saxon.tree.tiny.TinyBuilder 
Error on line 1 column 1 of .htaccess: 
    SXXP0003: Error reported by XML parser: Content is not allowed in prolog. 
Query failed with dynamic error: org.xml.sax.SAXParseException; systemId: file:<filefolder>/.htaccess; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog. 

Il me est assez évident que ce qui se passe est que ça devient le fichier .htaccess, qui n'est pas XML , et puis ne sait pas quoi faire avec. Ma question est de savoir s'il y a un moyen dans mon fichier xquery de dire à Saxon de ne pas inclure .htaccess dans la collection. Je suis sûr que c'est le cas, mais tout ce que j'ai trouvé est de trouver des noms de fichiers, pas de les supprimer dans la collection que vous construisez.

Répondre

2

Ok, je suis juste stupide. La solution est d'ajouter une déclaration concat pour ajouter l'information de sélection à la variable $ collection, comme ceci:

let $collection:=concat($collection, '?select=*.xml') 
let $q:=collection($collection) 
let $remove-list := ('note') 
3

Si vous avez besoin quelque chose de plus complexe que la sélection en utilisant un modèle de glob, vous pouvez utiliser la fonction uri-collection() pour retourner les URI des fichiers dans le répertoire, puis utilisez doc() pour traiter ceux qui vous intéressent vraiment. Cela vous donnerait une solution si, par exemple, vous vouliez tout ce qui ne commence pas par ".", indépendamment de son extension. Une autre chose que vous pouvez faire avec uri-collection() est de traiter chaque URI retourné dans un bloc try/catch afin que vous ayez un contrôle total sur la gestion des erreurs.