如何使用 FLOWR 和 XQuery 创建一个新的列表项?



我希望从XML文件中选择非数字数据,以将其粉碎为数据库列,或者至少是类似xmltable的结构。 这个FLWOR给出了一个有用的结果:

xquery version "3.0";
declare namespace office="urn:oasis:names:tc:opendocument:xmlns:text:1.0";
<ul>
{
for $foo  in db:open("foo")
return <li>{$foo//text()[not(matches(., '[0-9]'))]}</li>
}
</ul>

但是,它将所有结果输出到单个li标签中,例如:

  • 阿 b c d

首选输出的形式为:

  • 一个

数据很可能以某种方式存在问题,因为FLOWR略有不同:

xquery version "3.0";
declare namespace office="urn:oasis:names:tc:opendocument:xmlns:text:1.0";
for $foo in db:open("foo")
return $foo//text()[not(matches(., '[0-9]'))]

当然会在新行上输出每个非数字字符串。 如何将其输出到列表中?

数据摘录:

<table:table-column table:style-name="co1" table:default-cell-style-name="ce17"/>
<table:table-row table:style-name="ro1">
<table:table-cell table:style-name="ce15" office:value-type="string" calcext:value-type="string">
<text:p>John Smith</text:p>
</table:table-cell>
</table:table-row>
<table:table-row table:style-name="ro2">
<table:table-cell table:style-name="ce16" office:value-type="string" calcext:value-type="string">
<text:p>(123) 456-7890</text:p>
</table:table-cell>
</table:table-row>
<table:table-row table:style-name="ro2">
<table:table-cell office:value-type="string" calcext:value-type="string">
<text:p>123 Main Street</text:p>
</table:table-cell>
</table:table-row>
<table:table-row table:style-name="ro2">
<table:table-cell office:value-type="string" calcext:value-type="string">
<text:p>Anywhere, ZZ 12345-6789</text:p>
</table:table-cell>
</table:table-row>
<table:table-row table:style-name="ro1">
<table:table-cell table:style-name="ce15" office:value-type="string" calcext:value-type="string">
<text:p>Jane Doe</text:p>
</table:table-cell>
</table:table-row>
<table:table-row table:style-name="ro2">
<table:table-cell table:style-name="ce16" office:value-type="string" calcext:value-type="string">
<text:p>(234) 567-8901</text:p>

如果你想为每个text()提供一个li,然后改变你正在迭代的内容。不要选择 for 循环中的text(),而是遍历每个text()

xquery version "3.0";
declare namespace office="urn:oasis:names:tc:opendocument:xmlns:text:1.0";
<ul>
{
for $foo  in db:open("foo")//text()[not(matches(., '[0-9]'))]
return <li>{$foo}</li>
}
</ul>

仅为了完整起见:

输出:

  • 电话
      1
    电话
      2 电话3
      • 细胞4
        首页5
    • 爱丽丝
      • 阿特里布6
        x7
        Y9
        Z10

    查询:

    xquery version "3.0";
    declare namespace office="urn:oasis:names:tc:opendocument:xmlns:text:1.0";
    <ul>
    {
    for $line in db:open("people")//text()
    return
    if (matches($line, "[0-9]"))
    then <ul>{$line}</ul>
    else <li>{$line}</li>
    }
    </ul>
    

    这应该对其他人有利吗?

    最新更新