如何根据是否匹配[0-9]
带有 a 的数字进行分组tumbling window
?
所需的输出:
...
<record>
<name>joe</name>
<data>phone1</data>
<data>phone2</data>
</record>
...
当前输出,未分组:
<xml>
<record>
<person key="$s" data="name">phone1</person>
</record>
<record>
<person key="$s" data="name">phone2</person>
</record>
<record>
<person key="$s" data="name">phone3sue</person>
</record>
<record>
<person key="$s" data="name">cell4</person>
</record>
<record>
<person key="$s" data="name">home5alice</person>
</record>
<record>
<person key="$s" data="name">atrib6</person>
</record>
<record>
<person key="$s" data="name">x7</person>
</record>
<record>
<person key="$s" data="name">y9</person>
</record>
<record>
<person key="$s" data="name">z10</person>
</record>
</xml>
输入:
<text>
<line>people</line>
<line>joe</line>
<line>phone1</line>
<line>phone2</line>
<line>phone3</line>
<line>sue</line>
<line>cell4</line>
<line>home5</line>
<line>alice</line>
<line>atrib6</line>
<line>x7</line>
<line>y9</line>
<line>z10</line>
</text>
这个概念是每个“人”都有一个名字(没有数字),也许还有其他数据。因此,希望阅读每一行,然后根据找到名称的位置进行分组。
代码:
xquery version "3.0";
<xml>
{
for tumbling window $line in db:open("foo.txt")//text()
start $s when matches($s, '[0-9]')
return
<record>
<person key='$s' data="name">{$line}</person>
</record>
}
</xml>
查看输出,“phone3sue”显然在进行一些匹配和分组,尽管并不完全符合预期,因为“phone3”应该在它自己的元素中,嵌套在“joe”而不是“sue”中。但是,仍然有一些匹配发生在那里。
来自撒克逊邮件列表:
2020 年 2 月 19 日星期三上午 10:31:37 -0800,thufir 脚本:
我将重新阅读有关窗口的部分;我的印象是它更多地用于显示或报告目的。
窗口化是您从数据流中取出块的方式。
您所拥有的是有效的线元素流;您可以识别“名称”行,但您现在不知道它们的距离/任何特定名称对之间的数据量。
Windows 让您说“我想要以名称行开头并继续(但不包括)下一个名称行的此流的块”。
您能否更具体地详细说明两个步骤的含义?
您正在尝试获取一些输入 XML 并将其转换为不同的输出 XML。
如果这是纯粹的转换——将所有名为 FOO 的元素更改为名为 BAZ 的元素——XQuery 不是最好的工具选择。如果可以,请使用 XSLT。它们在计算上是相同的,但语言有不同的偏见,XSLT 确实可以更自然地进行转换。
如果输出 XML 是您输入的抽象的表示——在道德上是某种报告——那么拥有抽象然后呈现它会有很大帮助。
因此,在您的情况下,您拥有的是一个包含名称和数据之间隐式关联的流。(这是一个行流;您知道这些数据行与该名称行一起使用的唯一方法是位置。所以隐含。)如果您将其转换为名称和数据之间的显式映射 - 例如通过创建一个映射变量,其中键是名称行的内容(以某种方式处理空格),每个键的条目是与该名称关联的数据行——您已经完成了抽象部分。
然后,您可以获取该映射并从中生成所需的 XML 输出,这比尝试结合“创建新 XML”和“执行抽象步骤”要简单得多。我发布的最后一件事是将地图转换为元素的示例,但作为一种模式,它只是
地图:钥匙($地图)!{.}{$map(.)}
(如果条目中有节点或序列,它会变得更加复杂,但不会更多。)
这让一些事情更接近意义?
——格雷登
_______________________________________________ saxon-help 邮件列表存档于http://saxon.markmail.org/saxon-help@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/saxon-help