XPath 计数转换的行

Posted

技术标签:

【中文标题】XPath 计数转换的行【英文标题】:XPath Count Transformed Lines 【发布时间】:2014-05-02 09:25:41 【问题描述】:

我需要将填充记录附加到使用 XSLT 生成的文件中。需要将文件中的总行数四舍五入到最接近的 10,这样如果存在以下情况:

FileHeader
SectionHeader
Detail
Detail
Detail
SectionFooter
FileFooter

总行数为 7 行,我需要添加 3 条填充记录:

FileHeader
SectionHeader
Detail
Detail
Detail
SectionFooter
FileFooter
[Filler Record]
[Filler Record]
[Filler Record]

我是否应该在每次编写一行时在 xslt 中增加一个变量并在最后使用它来进行 mod 数学运算,或者是否有办法让 xslt/xpath 知道它当前写入了多少行,例如是否有一些更可靠的函数调用可以让我得到这个计数?

【问题讨论】:

XSLT 不是过程语言,而是声明性功能语言;只要您在考虑诸如增加变量之类的术语,您就会与语言抗争,而不是使用它。您能否编写一个 XPath 表达式来匹配所有且仅匹配将产生一个输出行的所有节点?然后将变量设置为count(...)(用那个XPath 表达式替换...)并进行模运算。如果不能,您可能需要将“添加填充记录”任务放到一个单独的步骤中。 是的,我的程序大脑正在为此崩溃......谢谢你的解释......我现在正在尝试这个 【参考方案1】:

没有办法在 XSLT 中增加变量。 XSLT 也不能告诉你它到目前为止写了多少行(因为 XSLT 被设计为更喜欢执行顺序独立性)。

相反,您可以

    根据输入文档,单独计算(例如计数)样式表应通过其他模板生成多少条记录。这是更简单的方法,如果输出记录的数量等于输入记录的数量,或者至少一个很容易根据另一个进行预测。或者,

    将初始转换的结果捕获到变量中(使用nodeset 扩展或使用XSLT 2.0),然后对其运行count() 以确定其中的记录数。然后执行xsl:copy-of 以输出捕获的结果,然后是所需的任何填充。

【讨论】:

我没有尽可能详细地介绍上述内容......相反,如果有你想要扩展的部分,我会让你告诉我。跨度> 所以就你的观点而言,就像你说的,#1 将是最简单的。谢谢先生!

以上是关于XPath 计数转换的行的主要内容,如果未能解决你的问题,请参考以下文章

如何将xpath位置转换为像素

如何将 Xpath 转换为 CSS

将 CSS 选择器转换为 XPATH

在有效的 PHP query() XPath 中转换 Javascript XPath |规范化 JS XPath --> PHP

将 XPath 转换为美丽的汤

如何在xpath python中转换变量