Saxon 可以在带有 .htaccess 的页面上工作吗?

Can Saxon work on a page with .htaccess?

由于 php 版本的 Saxon 存在一些问题,我目前有一个复杂的设置,我在其中执行 php 调用以执行 java 命令,将结果转换为html,在我的页面显示那个html,然后删除显示后的结果html。如果有帮助,我可以向页面提供 link,但实际的 .xq 文件非常简单:

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 文件是目前未发布的转录本,我想将它们保存在受密码保护的文件夹中,直到我认为它们已准备就绪。如果我在文件夹位置有任何类型的 .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 文件中是否有一种方法可以告诉 Saxon 不要在集合中包含 .htaccess。我确定有,但我发现的所有内容都是关于查找文件名,而不是关于在您正在构建的集合中抑制它们。

好吧,我只是愚蠢。解决方案是添加一个 concat 语句以将 select 信息附加到 $collection 变量,如下所示:

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

如果你需要比使用 glob 模式选择更精细的东西,那么你可以使用 uri-collection() 函数来 return 目录中文件的 URI,然后使用 doc() 来处理您真正感兴趣的内容。这将为您提供一个解决方案,例如,如果您想要所有不以“.”开头的内容,无论其扩展名如何。

您可以使用 uri-collection() 做的另一件事是在 try/catch 块中处理每个 returned URI,这样您就可以完全控制错误处理。