地图合并的 BaseX XQuery 问题?
BaseX XQuery issue with map merge?
我想在 BaseX 上使用 XQuery(目前使用 BaseX v9.4.1)将 CSV 转换为 XML。使用列制表符分隔 CSV 文件 Configuration.tsv
(input) 如下所示:
Datasets Autosar Fibex TSS0001 TSS0002 TSS0003
DS0001 AutosarFoo01.arxml FibexFoo01.xml x x
DS0002 AutosarFoo02.arxml FibexFoo02.xml x x
DS0003 AutosarFoo03.arxml FibexFoo03.xml x x
脚本将 tssid
作为输入参数。设置 tssid := TSS0001
expected output XML 是:
<database name="DS0001" autosar="AutosarFoo01.arxml" fibex="FibexFoo01.arxml"/>
<database name="DS0002" autosar="AutosarFoo02.arxml" fibex="FibexFoo02.arxml"/>
<database name="DS0003" autosar="AutosarFoo03.arxml" fibex="FibexFoo03.arxml"/>
与 tssid := TSS0003
:
<database name="DS0002" autosar="AutosarFoo02.arxml" fibex="FibexFoo02.arxml"/>
<database name="DS0003" autosar="AutosarFoo03.arxml" fibex="FibexFoo03.arxml"/>
脚本工作正常,但缺少第三个属性值 (fibex
),因此输出看起来与此不同:
<database name="DS0001" autosar="AutosarFoo01.arxml" fibex=""/>
<database name="DS0002" autosar="AutosarFoo02.arxml" fibex=""/>
<database name="DS0003" autosar="AutosarFoo03.arxml" fibex=""/>
或 tssid := TSS0003
:
<database name="DS0002" autosar="AutosarFoo02.arxml" fibex=""/>
<database name="DS0003" autosar="AutosarFoo03.arxml" fibex=""/>
我找不到这段代码有什么问题?!? :
xquery version "3.1" encoding "utf-8";
declare namespace test="unittest";
declare namespace map="http://www.w3.org/2005/xpath-functions/map";
declare variable $test:tssid := 'TSS0003';
declare variable $test:testsuitesfile := '/Users/ms/Projekte/UnitTests/Configuration.tsv';
declare variable $test:options := map { 'header' : 'yes', 'format' : 'attributes', 'separator' : 'tab' };
declare variable $test:xml := csv:doc($test:testsuitesfile,$test:options);
(: get the positions :)
declare variable $test:positionDataId := 1 ;
declare variable $test:positionTssCheck := $test:xml/csv/record[position() = 1]/entry[text() = $test:tssid]/count(./preceding-sibling::entry) + 1 ;
declare variable $test:positionAutosar := $test:xml/csv/record[position() = 1]/entry[text() = 'Autosar']/count(./preceding-sibling::entry) + 1 ;
declare variable $test:positionFibex := $test:xml/csv/record[position() = 1]/entry[text() = 'Fibex']/count(./preceding-sibling::entry) + 1 ;
declare variable $test:dbsetbycsv as map(*) := map:merge(for $record in $test:xml/csv/record[entry[position() = $test:positionTssCheck and text()='x']] return map:entry($record/entry[position() = $test:positionDataId]/text(),<database name="{$record/entry[position() = $test:positionDataId]/text()}" autosar="{$record/entry[position() = $test:positionAutosar]/text()}" fibex="{$record/entry[position() = $test:positionFibex]/text()}"/>));
declare variable $test:dbset := $test:dbsetbycsv;
declare function test:dump() {
for-each(
map:keys($test:dbset),
function($k) {
$test:dbset($k)
}
)
};
let $result := test:dump()
return($result)
这是一个错误。现已修复 BaseX 9.4.3 beta。
好像
$xml/csv/record[entry[@name = $tssid and . = 'x']] ! <database name="{entry[@name = 'Datasets']}" autosar="{entry[@name = 'Autosar']}" fibex="{entry[@name = 'Fibex']}"/>
可能就足够了,因为 entry
元素具有 name
属性。
我想在 BaseX 上使用 XQuery(目前使用 BaseX v9.4.1)将 CSV 转换为 XML。使用列制表符分隔 CSV 文件 Configuration.tsv
(input) 如下所示:
Datasets Autosar Fibex TSS0001 TSS0002 TSS0003
DS0001 AutosarFoo01.arxml FibexFoo01.xml x x
DS0002 AutosarFoo02.arxml FibexFoo02.xml x x
DS0003 AutosarFoo03.arxml FibexFoo03.xml x x
脚本将 tssid
作为输入参数。设置 tssid := TSS0001
expected output XML 是:
<database name="DS0001" autosar="AutosarFoo01.arxml" fibex="FibexFoo01.arxml"/>
<database name="DS0002" autosar="AutosarFoo02.arxml" fibex="FibexFoo02.arxml"/>
<database name="DS0003" autosar="AutosarFoo03.arxml" fibex="FibexFoo03.arxml"/>
与 tssid := TSS0003
:
<database name="DS0002" autosar="AutosarFoo02.arxml" fibex="FibexFoo02.arxml"/>
<database name="DS0003" autosar="AutosarFoo03.arxml" fibex="FibexFoo03.arxml"/>
脚本工作正常,但缺少第三个属性值 (fibex
),因此输出看起来与此不同:
<database name="DS0001" autosar="AutosarFoo01.arxml" fibex=""/>
<database name="DS0002" autosar="AutosarFoo02.arxml" fibex=""/>
<database name="DS0003" autosar="AutosarFoo03.arxml" fibex=""/>
或 tssid := TSS0003
:
<database name="DS0002" autosar="AutosarFoo02.arxml" fibex=""/>
<database name="DS0003" autosar="AutosarFoo03.arxml" fibex=""/>
我找不到这段代码有什么问题?!? :
xquery version "3.1" encoding "utf-8";
declare namespace test="unittest";
declare namespace map="http://www.w3.org/2005/xpath-functions/map";
declare variable $test:tssid := 'TSS0003';
declare variable $test:testsuitesfile := '/Users/ms/Projekte/UnitTests/Configuration.tsv';
declare variable $test:options := map { 'header' : 'yes', 'format' : 'attributes', 'separator' : 'tab' };
declare variable $test:xml := csv:doc($test:testsuitesfile,$test:options);
(: get the positions :)
declare variable $test:positionDataId := 1 ;
declare variable $test:positionTssCheck := $test:xml/csv/record[position() = 1]/entry[text() = $test:tssid]/count(./preceding-sibling::entry) + 1 ;
declare variable $test:positionAutosar := $test:xml/csv/record[position() = 1]/entry[text() = 'Autosar']/count(./preceding-sibling::entry) + 1 ;
declare variable $test:positionFibex := $test:xml/csv/record[position() = 1]/entry[text() = 'Fibex']/count(./preceding-sibling::entry) + 1 ;
declare variable $test:dbsetbycsv as map(*) := map:merge(for $record in $test:xml/csv/record[entry[position() = $test:positionTssCheck and text()='x']] return map:entry($record/entry[position() = $test:positionDataId]/text(),<database name="{$record/entry[position() = $test:positionDataId]/text()}" autosar="{$record/entry[position() = $test:positionAutosar]/text()}" fibex="{$record/entry[position() = $test:positionFibex]/text()}"/>));
declare variable $test:dbset := $test:dbsetbycsv;
declare function test:dump() {
for-each(
map:keys($test:dbset),
function($k) {
$test:dbset($k)
}
)
};
let $result := test:dump()
return($result)
这是一个错误。现已修复 BaseX 9.4.3 beta。
好像
$xml/csv/record[entry[@name = $tssid and . = 'x']] ! <database name="{entry[@name = 'Datasets']}" autosar="{entry[@name = 'Autosar']}" fibex="{entry[@name = 'Fibex']}"/>
可能就足够了,因为 entry
元素具有 name
属性。