问题
I'm looking to select non-numerical data from an XML file towards shredding it into database columns, or at least an xmltable-like structure. This FLWOR gives a somewhat useful result:
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>
However, it outputs all results into a single li tag, like:
- a b c d
Preferred output would be of the form:
- a
- b
Most likely the data is problematic in some way, because a slightly different 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]'))]
certainly outputs each non-numerical string on a new line. How can I output this into a list?
An excerpt of the data:
<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>
回答1:
If you want an li for each of the text(), then alter what you are iterating over. Instead of selecting the text() inside of the for loop, iterate over each of the 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>
回答2:
Only for completeness:
output:
- people
- joe
- sue
- alice
- phone1
- phone2
- phone3
- cell4
- home5
- atrib6
- x7
- y9
- z10
query:
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>
Should this benefit anyone else.
来源:https://stackoverflow.com/questions/60229052/how-to-create-a-new-list-item-with-flowr-and-xquery