2017-09-18 114 views
1

由于与撒克逊人的PHP版本的一些问题,我现在有一个令人费解的设置,其中我做了PHP的调用来执行Java命令,结果转换成HTML,显示我的页面上的HTML,然后删除生成的HTML显示后。我可以提供一个链接页面是否有帮助,但实际.xq文件相当简单:可以用的.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> 

和命令来运行它是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>

我的问题是,XML文件我米,工作是目前尚未发布抄录,我想,让他们受密码保护的文件夹背后,直到我认为他们已经准备好黄金时间。如果我在filefolder位置的任何类型的.htaccess文件的存在,我收到以下错误信息:

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. 

这是很明显,我认为发生的事情是,它得到的.htaccess文件,这不是XML ,然后不知道该如何处理它。我的问题是,如果有一个在我的XQuery文件的方式来告诉撒克逊不包括集合中的.htaccess。我确定有,但是我发现的一切都是关于寻找文件名,而不是在你正在构建的集合中压制它们。

回答

2

好吧,我只是愚蠢。解决的办法是增加一个CONCAT声明追加选择信息到$集合变量,就像这样:

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

如果你需要的东西比使用glob模式选择更精细的,那么你可以使用uri-collection()功能返回目录中文件的URI,然后使用doc()来处理你真正感兴趣的文件。例如,如果你想要所有不是以“。”开头的东西,这会给你一个解决方案,不管它的扩展如何。

你可以用uri-collection()做的另一件事是处理try/catch块中的每个返回的URI,以便完全控制错误处理。