如何对有序XML节点进行分组?

问题描述 投票:0回答:2

我如何对一个非结构化列表进行分组,以便每个代表名称的字母条目然后“具有”嵌套为该名称的数字数据?所需的output将是任何形式的嵌套列表,而不必是HTML

  • a
    • 1
    • 2
    • 3
  • b
    • 4
    • 5
    • 6
  • c
    • 7
    • 8
    • 9

并非所有节点都将具有三个“子节点”,这是一种one-to-many关系:在零和较大数之间。

raw数据:

thufir@dur:~/flwor/people$ 
thufir@dur:~/flwor/people$ basex
BaseX 9.0.1 [Standalone]
Try 'help' to get more information.
> 
> open people
Database 'people' was opened in 217.37 ms.
> 
> xquery /
<text>
  <line/>
  <line>a</line>
  <line>1</line>
  <line>2</line>
  <line>3</line>
  <line>b</line>
  <line>4</line>
  <line>5</line>
  <line>6</line>
  <line>c</line>
  <line>7</line>
  <line>8</line>
  <line>9</line>
  <line/>
</text>
Query executed in 227.6 ms.
> 
> exit
See you.
thufir@dur:~/flwor/people$ 

某些输出:

thufir@dur:~/flwor/people$ 
thufir@dur:~/flwor/people$ basex each.xq 
<ul>
  <li>a123b456c789</li>
</ul>thufir@dur:~/flwor/people$ 
thufir@dur:~/flwor/people$ basex names.xq 
a
b
cthufir@dur:~/flwor/people$ 
thufir@dur:~/flwor/people$ basex pipe.xq 
<doc>
  <data>
    <text>
      <line/>
      <line>a</line>
      <line>1</line>
      <line>2</line>
      <line>3</line>
      <line>b</line>
      <line>4</line>
      <line>5</line>
      <line>6</line>
      <line>c</line>
      <line>7</line>
      <line>8</line>
      <line>9</line>
      <line/>
    </text>
  </data>
</doc>thufir@dur:~/flwor/people$ 
thufir@dur:~/flwor/people$ 

简单查询:

thufir@dur:~/flwor/people$ 
thufir@dur:~/flwor/people$ cat each.xq 

xquery version "3.0";
declare namespace office="urn:oasis:names:tc:opendocument:xmlns:text:1.0";

<ul>
{
for $foo  in db:open("people")
return <li>{data($foo)}</li>

}
</ul>
thufir@dur:~/flwor/people$ 
thufir@dur:~/flwor/people$ cat names.xq 

xquery version "3.0";
declare namespace office="urn:oasis:names:tc:opendocument:xmlns:text:1.0";

for $foo in db:open("people")
return $foo//text()[not(matches(., '[0-9]'))]

thufir@dur:~/flwor/people$ 
thufir@dur:~/flwor/people$ cat pipe.xq 
  <doc>{
    for $foo in db:open("people")
    return
      if (matches($foo, "[0-9]")) 
      then <data>{$foo}</data>
      else <name>{$foo}</name>
  }</doc>

thufir@dur:~/flwor/people$ 

简化earlier问题,使其更加具体。

xpath xquery xmltable flwor shred
2个回答
1
投票

如果使用3.0或3.1,请使用FLWOR表达式的“ window”子句。有点像

for tumbling window $w in line
    start $s when matches($s, '[a-z]')
    return <group key="$s">{$w}</group>

未经测试,可能需要更正或改编。


0
投票

嗯,这看起来很有希望。但是,尚不确定在逻辑上区分文本的方式,以便“ joe”具有一个键,而“ phone1”具有另一个键。

输入:

<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>

输出:

<group key="$s">phone1</group>
<group key="$s">phone2</group>
<group key="$s">phone3</group>
<group key="$s">cell4</group>
<group key="$s">home5</group>
<group key="$s">atrib6</group>
<group key="$s">x7</group>
<group key="$s">y9</group>
<group key="$s">z10</group>

代码:

xquery version "3.0";

for $line in db:open("foo.txt")//text()

for tumbling window $w in $line
    start $s when matches($s, '[0-9]')
    return <group key="$s">{$w}</group>
© www.soinside.com 2019 - 2024. All rights reserved.