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 计数转换的行的主要内容,如果未能解决你的问题,请参考以下文章
在有效的 PHP query() XPath 中转换 Javascript XPath |规范化 JS XPath --> PHP