【发布时间】:2021-06-29 02:13:27
【问题描述】:
我将 Saxon 放在我的类路径中,以便随后 X-definition API 可以发现它,但是为了使我的 Xpath 3.1 表达式的结果能够一致地显示,我有必要使用 Xpath 的 @ 987654322@函数:
<?xml version="1.0" encoding="UTF-8"?>
<xd:def xmlns:xd="http://www.xdef.org/xdef/4.0" name="frontend" root="code">
<xd:declaration>
String myxpathexpression = "let $b := 'away I go' return (0 to string-length($b)) ! (' ' || substring($b,1,string-length($b) - .))";
String valueofmyxpathexpression = "serialize(" + myxpathexpression + ")";
</xd:declaration>
<code xd:script="occurs +;init {outln(xpath(valueofmyxpathexpression));}"/>
<!--<code xd:script="occurs +;init {outln(xpath(myxpathexpression));}"/>-->
</xd:def>
(作为对这个问题的回应发表的评论已经确定,上述代码中使用的 Xpath 表达式碰巧已经不能胜任它表面上为自己设定的任务。因为 Martin Honnen 提供的 Xpath 表达式在他的评论充分考虑了返回项目的顺序,而前一个表达式几乎没有任何内容,下面打印的代码可以省去之前采取的权宜之计:
<?xml version="1.0" encoding="UTF-8"?>
<xd:def xmlns:xd="http://www.xdef.org/xdef/4.0" name="frontend" root="code">
<xd:declaration>
<!-- https://stackoverflow.com/questions/68171810/does-x-definition-possess-an-instruction-similar-to-xslvalue-of-in-xslt -->
String myxpathexpression = "string-join(let $b := 'away I go' return (0 to string-length($b)) ! (' ' || substring($b,1,string-length($b) - .)), ' ')";
</xd:declaration>
<code xd:script="occurs +;init {outln(xpath(myxpathexpression));}"/>
</xd:def>
为允许糟糕的代码分散其他人可能希望在未来提出的问题的注意力而致歉,不用说)。
(这两篇代码都是通过管道echo "<code/>" 到Java 命令并指定/dev/stdin 作为XML 的源来运行的。
当绑定到 Xpath 表达式本身的变量 (myxpathexpression) 被传递给 X-script 的 xpath() 函数的行被取消注释(并且相应的行被注释掉)时,似乎@987654329 的第二个参数@ 是隐含的,并且该函数实际上旨在根据来自 Element 等的可用数据填充 Container,而不是使用 Xpath 表达式生成的项目来填充其中一个本身时间>。将null 作为第二个参数显式传递似乎不可行。
我是否忽略了 X-definition 的 XML 词汇表或其 X-script 语言中与 XSLT 的 xsl:value-of 指令类似的任何内容?我已尽我所能查阅了包括词典在内的用户文档,但不幸的是,越是明显的东西越容易漏掉,我也没有什么不同。
【问题讨论】:
-
是否有任何与您似乎使用的技术(xdef、x-script)相关的标签?我看不出知道 XPath 或 XSLT 的人如果不知道宿主语言,如何回答嵌入 XPath 的不同语言的问题。因此,请考虑为您主要使用的语言添加标签,以确保具有该领域专业知识的人可以看到它。
-
如果一般问题是如何从 XPath 2 或 3 中的字符串项序列中获取单个字符串,则
string-join(let $b := 'away I go' return (0 to string-length($b)) ! ('&#10;' || substring($b,1,string-length($b) - .)), ' ')可能是一种不需要序列化的方法。 -
@MartinHonnen,非常感谢你!事实上,我的 Xpath 代码一开始就没有充分考虑生成一系列项目的后果。我根本没有想到,最好的编码实践实际上相当于完成了我开始的工作,确保序列包含的项目类型和序列的范围都不会成为障碍,无论正在使用的 API(在这里,它一直依赖于 java.io.PrintStream.println() 的别名)。我只能再次感谢你!
-
关于标签,目前为止似乎还没有引入与X-definition有关的标签。我希望我添加的链接是一个改进。 Github 项目本身似乎带有“xdef”而不是“X-definition”的名称;
xdef还用作包层次结构中顶层的 Java 标识符 (org.xdef),在示例中,我们发现.xdef用作文件扩展名。文档中遵循的约定使用大写 X 和连字符后跟小写(而不是大写)字母来标识应用程序或其部分,例如X 脚本。