换行符从命令行分隔Saxon-HE 9.6的输出

时间:2014-12-14 22:54:48

标签: xml xslt xpath saxon

有没有办法在Saxon-HE 9.6的多个匹配节点上获取换行符分隔输出?

我使用这个名为saxon-lint的包装器:

#!/bin/bash

java -cp /path/to/saxon9he.jar net.sf.saxon.Query -s:"$2" -qs:"$1" !method=text

示例:

file.xml

<house_pet_hazards>
  <hazard type="cleanup">
    <name>hairballs</name>
    <guilty_party species="cat">Dilly</guilty_party>
    <guilty_party species="cat">Nameless</guilty_party>
    <guilty_party species="cat">Katie</guilty_party>
  </hazard>
</house_pet_hazards>

命令行:

$ saxon-lint '/house_pet_hazards/hazard/guilty_party' file.xml

输出:

DillyNamelessKatie

预期输出:

Dilly
Nameless
Katie

修改

I've found a semi-working solution by searching google hardly提出了

Michael Kay,所以我写了这个包装器:

#!/bin/bash

xpath="$1"
[[ -s $2 ]] && file="$(readlink -f "$2")" || file=/dev/stdin

java -cp saxon9he.jar net.sf.saxon.Query -qs:"for \$x in doc('file://$file')$xpath
return (data(\$x),text{'&#10;'})" !method=text

输出:

$ saxon-lint "/house_pet_hazards/hazard/guilty_party" /tmp/file.xml
Dilly
Nameless
Katie

但我发现的问题是当我使用路径时

house_pet_hazards/hazard/guilty_party

我收到错误

Error on line 1 column 37 
  XPST0003 XQuery syntax error near #...p/file.xml')house_pet_hazards/#:
    expected "return", found name "house_pet_hazards"
Static error(s) in query

./house_pet_hazards/hazard/guilty_party

我收到错误:

Error on line 1 column 37 
  XPST0003 XQuery syntax error near #... doc('file:///tmp/file.xml')./#:
    expected "return", found "."
Static error(s) in query

The wrapper


3 个答案:

答案 0 :(得分:4)

当然,只需将查询字符串更改为:

-qs:"string-join(/house_pet_hazards/hazard/guilty_party,'&#xA;')"

您也可以缩短//guilty_party的路径。

Cygwin中的bash脚本示例:

[/cygdrive/c/apps/SaxonHE9-6-0-3J]
==> cat saxon-lint.bsh
#!/bin/bash.exe

java -cp saxon9he.jar net.sf.saxon.Query -s:$2 -qs:"string-join($1,'&#xA;')" !method=text

[/cygdrive/c/apps/SaxonHE9-6-0-3J]
==> ./saxon-lint.bsh //guilty_party so.xml
Dilly
Nameless
Katie

答案 1 :(得分:2)

您的查询选择三个元素节点;文本输出方法的作用是构造一个包含这三个元素的文档节点,然后输出文档节点的字符串值,这是三个元素的字符串值的串联。

原则上,您可以通过将item-separator序列化属性设置为换行符来解决问题。不幸的是,我无法在命令行上找到任何方法来实现这一点,因为换行符会终止命令。也许!item-separator =&#34; \ n&#34;会在一些贝壳中工作,但是当我尝试它时,你会得到一个文字&#34; \ n&#34;作为项目分隔符。

所以我认为你必须使用string-join()更改查询以显式插入分隔符。

答案 2 :(得分:0)

在bash上,您可以将其添加为序列化参数:

 $'!item-separator=\n'

这使用bash $''语法,它启用了一些转义字符,例如\n

提醒您,它不会在最后一项之后打印换行符。