2017-09-18 2 views
1

Aufgrund einiger Probleme mit der php-Version von Saxon, habe ich derzeit eine komplizierte Setup, wo ich einen PHP-Aufruf ausführen einen Java-Befehl, konvertieren Sie die Ergebnisse in HTML, zeigen Sie diese HTML auf meiner Seite, und löschen Sie den resultierenden HTML nach der Anzeige. Ich kann einen Link zu der Seite zur Verfügung stellen, wenn es hilft, aber die tatsächliche .xq Datei ist ziemlich simpel:Kann Saxon auf einer Seite mit .htaccess arbeiten?

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> 

und der Befehl ausgeführt werden sollen es 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>

Mein Problem ist, dass die XML-Dateien I‘ Ich arbeite mit unveröffentlichten Transkriptionen und möchte sie hinter einem passwortgeschützten Ordner behalten, bis ich denke, dass sie für die Primetime bereit sind. Wenn ich jede Art von .htaccess Datei im filefolder Lage habe, bekomme ich folgende Fehlermeldung:

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. 

Es ist ziemlich mir klar, dass passiert, was ist, dass es in die .htaccess-Datei wird immer, die nicht XML ist und weiß dann nicht, was damit zu tun ist. Meine Frage ist, ob es einen Weg in meiner xquery-Datei gibt, um Saxon zu sagen, dass er .htaccess nicht in die Sammlung aufnehmen soll. Ich bin sicher, dass es da ist, aber alles, was ich gefunden habe, geht es darum, Dateinamen zu finden, und nicht darum, sie in der Sammlung zu unterdrücken, die Sie erstellen.

Antwort

2

Ok, ich bin nur dumm. Die Lösung ist eine concat-Anweisung hinzufügen, um die Auswahl Infos zu den $ Sammlung Variable anhängen, etwa so:

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

Wenn Sie jemals etwas aufwendiger als Auswahl benötigen ein glob Muster verwenden, dann können Sie die uri-collection() Funktion um die URIs der Dateien in dem Verzeichnis zurückzugeben und dann doc() zu verwenden, um diejenigen zu bearbeiten, an denen Sie wirklich interessiert sind. Dies würde Ihnen eine Lösung geben, wenn Sie zum Beispiel alles wollten, was nicht mit "." unabhängig von seiner Erweiterung.

Eine andere Sache, die Sie mit uri-collection() tun können, ist die Verarbeitung jedes zurückgegebenen URI innerhalb eines try/catch-Blocks, so dass Sie die volle Kontrolle über die Fehlerbehandlung haben.

Verwandte Themen