当前位置: 首页 > 知识库问答 >
问题:

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

终洛华
2023-03-14

对于Saxon-HE9.6,有没有办法在多个匹配节点上获得换行分隔的输出?

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

#!/bin/bash

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

示例:

<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

我通过搜索google发现了一个半有效的解决方案,几乎不是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

共有1个答案

丌官晨
2023-03-14

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

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

因此,我认为您必须更改查询,使用string-join()显式插入分隔符。

 类似资料:
  • 有人能发布详细的分步说明如何安装Saxon(10 HE)以及如何从MacOS(10.13.6)中的命令行运行转换吗? 我已经在我的计算机上安装了Java 我已经下载了SaxonHE10-6J。来自SourceForge的zip文件 根据这里的建议,我放置了saxon-he-10.6。jar位于myUserName/Library/Java/Extensions文件夹中 然后,我打开终端应用程序并根

  • 正如在如何使用XPath with Saxon-HE in command Line?中看到的,我尝试使用Saxon和XPath查询HTML。 我在Linux shell中尝试了以下内容: 它可以工作,但我想设置一个默认的名称空间,以便能够查询HTML文件而不需要前缀或通配符,通过示例: 应该是有效的查询。 知道吗?

  • 我使用Saxon HE9.5作为XSLT处理器。由于源是一个大尺寸的XML,我需要最小化输出的大小。但是,使用Saxon他将在每个元素标记之间添加换行符。如下面的示例:

  • 我想在基于Saxon的xslt转换中使用排序规则。源文件: 和我的转变: 这在氧气中几乎很好工作,输出为: (“”应该是第二个条目,但我想这是另一个问题) 看起来好像saxon现在想要使用作为文件。它不存在。 问题是:我如何在命令行上使用这个样式表。 如果合适的话,我还想问一下如何在两个“A”之间排序“?”但我可以在另一个问题中问这个。

  • 我正在为班级做一个XSLT作业。说明告诉我“通过在alldepartments.xsl样式表中应用getEmployees模板来生成结果文档horizons.xml。” 于是,我打开终端进入:java net。旧金山。撒克逊人。转变it:让所有部门都有员工。xsl-o:horizons。xml 我收到了错误消息:“错误:无法找到或加载主类net.sf.saxon.Transform,原因是:jav

  • 如果表达式无法在一行输入完,用三点"…"加回车键表示下一行继续该语句的输入.例如: s = 1 -1/2 + 1/3 -1/4 + 1/5 - 1/6 + 1/7 ... - 1/8 + 1/9 - 1/10 + 1/11 - 1/12; "=","+"和"-"符号前后的空格可以省略,但使用可以增加易读性.