【发布时间】:2017-09-21 13:51:50
【问题描述】:
给定以下 xml 文件作为输入:
<?xml ="1.0" encoding="UTF-8"?>
<TABLE NAME="TABLE.DB">
<DATA RECORDS="2">
<RECORD ID="1">
<RECNO>1</RECNO>
<SEQ>0</SEQ>
<DATE>17/12/1999 2:44:08 μμ</DATE>
<ID>12/11/2015 3:15:25 μμ</ID>
<NUMBER>10355</NUMBER>
<CN>PL</CN>
<PROPERTY>0</PROPERTY>
<DAYS>0</DAYS>
<CURRENTSTATUS>0</CURRENTSTATUS>
<TOTALS>1</TOTALS>
<SUB_A>Some (random) data.</SUB_A>
</RECORD>
<RECORD ID="2">
<RECNO>2</RECNO>
<SEQUENCE>0</SEQUENCE>
<DATE>17/12/1999 2:44:08 μμ</DATE>
<ID>12/11/2015 3:15:25 μμ</ID>
<NUMBER>10356</NUMBER>
<CN>PL 300 L</CN>
<PROPERTY>0</PROPERTY>
<DAYS>10</DAYS>
<CURRENTSTATUS>0</CURRENTSTATUS>
<TOTALS>19837</TOTALS>
</RECORD>
<RECORD ID="3">
<RECNO>3</RECNO>
<SEQUENCE>0</SEQUENCE>
<DATE>17/12/1999 2:44:08 μμ</DATE>
<ID>12/11/2015 3:15:25 μμ</ID>
<NUMBER>10357</NUMBER>
<CN>PL 300 L</CN>
<PROPERTY>0</PROPERTY>
<DAYS>10</DAYS>
<CURRENTSTATUS>0</CURRENTSTATUS>
<SUB_A>Some [more] data.</SUB_A>
</RECORD>
</DATA>
</TABLE>
我想根据以下条件将数据插入到 SUB_A 元素中: 我有一个制表符分隔的文件,
value A NUMBER TOTALS
其中值 A 必须在 SUB_A 元素中输入,并带有 |作为分隔符,如果 SUB_A 已经存在于记录中,或者要创建,如果它不存在。 NUMBER 和 TOTALS 是我们需要的,以便在将发生转换的记录上进行匹配。有时,在我们的输入 txt 文件中,值 TOTALS 可能根本不存在:
所以我们的 transform.txt 文件看起来像:
编辑:
请先生使用解决方案。 Honnen 建议,输入数据建议,当我有输入时:
value i'd like to add 10355 1
another) value i'd like to add 10357 19837
yet another value.] 10358
test 10354
我收到以下错误:
Tree size: 113 nodes, 392 characters, 7 attributes
<line number="10355" totals="1">value i'd like to add</line><line number="10357" totals="19837">another) value i'd like to add</line><line number="10358" totals="">yet another value.]</line><line number="10354" totals="">test</line>
Error at char 6 in xsl:merge-source/@select on line 26 column 65 of merge.xsl:
XTDE2220: Merge input for source line is not ordered according to merge key, detected at
key value: ["10354", ""]
in built-in template rule for /TABLE/DATA[1] in the unnamed mode
at xsl:apply-templates (/merge.xsl#21)
processing /TABLE
Merge input for source line is not ordered according to merge key, detected at key value: ["10354", ""]
预期结果:
<?xml ="1.0" encoding="UTF-8"?>
<TABLE NAME="TABLE.DB">
<DATA RECORDS="2">
<RECORD ID="1">
<RECNO>1</RECNO>
<SEQ>0</SEQ>
<DATE>17/12/1999 2:44:08 μμ</DATE>
<ID>12/11/2015 3:15:25 μμ</ID>
<NUMBER>10355</NUMBER>
<CN>PL</CN>
<PROPERTY>0</PROPERTY>
<DAYS>0</DAYS>
<CURRENTSTATUS>0</CURRENTSTATUS>
<TOTALS>1</TOTALS>
<SUB_A>Some (random) data. | value i'd like to add</SUB_A>
</RECORD>
<RECORD ID="2">
<RECNO>2</RECNO>
<SEQUENCE>0</SEQUENCE>
<DATE>17/12/1999 2:44:08 μμ</DATE>
<ID>12/11/2015 3:15:25 μμ</ID>
<NUMBER>10356</NUMBER>
<CN>PL 300 L</CN>
<PROPERTY>0</PROPERTY>
<DAYS>10</DAYS>
<CURRENTSTATUS>0</CURRENTSTATUS>
<TOTALS>19837</TOTALS>
<SUB_A>(another) value i'd like to add</SUB_A>
</RECORD>
<RECORD ID="3">
<RECNO>3</RECNO>
<SEQUENCE>0</SEQUENCE>
<DATE>17/12/1999 2:44:08 μμ</DATE>
<ID>12/11/2015 3:15:25 μμ</ID>
<NUMBER>10357</NUMBER>
<CN>PL 300 L</CN>
<PROPERTY>0</PROPERTY>
<DAYS>10</DAYS>
<CURRENTSTATUS>0</CURRENTSTATUS>
<SUB_A>Some [more] data. | [yet another value.]</SUB_A>
</RECORD>
</DATA>
</TABLE>
我已经尝试过,会使问题变得更大,并且没有让我接近我所寻找的...
【问题讨论】:
-
这些数值是否像示例中的那样是 ordere3d ?您使用哪种 XSLT 2.0 处理器?虽然有多种策略可以解决,但这对于 Saxon 9.8 和新的
xsl:merge元素来说可能是一个很好的问题。一般来说,我首先建议使用unparsed-text(-lines)和tokenize或analyze-string将制表符分隔的数据转换为XML。 -
数值是按照我做例子的顺序排列的,但是显然在真实的xml中,也有根本不匹配的记录,所以在我选择的记录之间,有还有其他不受影响的记录 - 转换。我更喜欢这样的指导,我使用的是 saxon,是的 9.8 版,所以我应该首先转换输入文件,或者可以在同一个 xsl 样式表中完成?
-
文本数据到 XML 的转换可以在合并数据的同一个样式表中完成。至于实际数据和可能丢失的
TOTALS,在 XML 输入数据和制表符分隔的数据中是否会丢失?如果 RECORD 有某个 NUMBER 与某行匹配,并且 TOTALS 存在于 RECORD 但该行中不存在,会发生什么情况?