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,这样您就可以完全控制错误处理。
由于 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,这样您就可以完全控制错误处理。