正如建议的那样。我在这里将问题 分解为多个部分。
我的输入 xml 表示字符串中存在字段。输入 xml 最多可以有 64 个字段元素。输入 xml 字段元素始终按升序出现。我的输入xml
<Root>
<element>field2</element>
<element>field3</element>
<element>field21</element>
</Root>
该字符串在 xslt 中定义为变量。
我的变量
<xsl:variable name="inputstring" select="'013112316145ABC0812345678'"/>
输入 xml 表示字段 2、3 和 21 是字符串中唯一的字段,将根据映射 xml 进行提取
这是映射xml
<Root>
<field no="2" charlength="2">variable</field>
<field no="3" total="4">fixed</field>
<field no="21" charlength="2">
<subfield no="1" total="3">fixed</subfield>
<subfield no="2" charlength="2" idcode="ABC">variable</subfield>
</field>
<field no="63" charlength="2">
<format1>
<subfield no="1" total="3">fixed</subfield>
</format1>
<format2>
<subfield no="1" total="3">fixed</subfield>
<subfield no="2" total="7">fixed</subfield>
</format2>
<format3>
<subfield no="1" total="3">fixed</subfield>
<subfield no="2" total="7">fixed</subfield>
<subfield no="3" total="6">fixed</subfield>
</format3>
</field>
</Root>
映射 xml 告诉以下内容
- 有四种类型的字段,固定的、可变的、具有子字段的字段(具有固定和可变的)和具有子字段的字段(具有不同的格式)
- 2号字段为可变字段(如上),前两个字符(charlength属性)表示字段的长度
- 字段 3 为固定字段,共 4 个字符。
- 字段 21 是具有子字段(固定和可变)的字段,其中前两个字符(charlength)表示字段的字符数
- 所有固定的(子字段)首先出现,然后是可变子字段
- 这里的子字段,总是以 idcode 开头(对于 21 的子,它是 ABC),然后是字符长度(charlength 属性),然后是子字段。字符的长度也可以为 0
- 所有固定和可变字段都出现,长度为 0 表示没有子字段(上点)
- 字段 63 是具有子字段的字段(具有不同的格式),根据字段的长度(charlength 属性),可能有不同的格式
- 对于字段63,如果长度为03(前两个字符,charlenghth属性),则为格式1。如果为10,则为格式2,如果为16,则为格式3
我想要的输出xml
<Root>
<field2>3</field2>
<!--value is 3 as the charlength is 2(which is 01)-->
<field3>1123</field3>
<!--field3 value is 1123 as it is fixed, total length of 4-->
<field21>
<subfield1>145</subfield1>
<!--subfield1 should be 145 as it is fixed length of total 3 chars-->
<subfield2>12345678</subfield2>
<!--sufield2 starts with 'ABC', has length 08 chars-->
</field21>
</Root>
肖恩编辑。
分解
这是输入和输出之间映射的分解。
这是我们的字符串变量 $inputstring 的图片
'013112316145ABC0812345678'
根据字段定义,这分为 3 个字段...
013 - 1123 - 16145ABC0812345678
| | v
v v field 21
field2 field3
让我们分解字段 2:
01 3
| v
| payload for field 2. This is output
v
Contains the length(1) of the payload, which in this case is '01' = 1
This length of this 'header' is given by mapping Root/field[@no="2"]/@charlength
The "2" in this expression comes from the input document node at Root/element .
让我们分解字段 21:
16 145 ABC0812345678
| | v
| | subfield 2
| \ subfield 1
\
v
Header for field 2. Says that the total field 2 length (header + subfield 1 +
subfield 2 consists of 16 characters. The length for this header was derived from
the mapping node at Root/field[@no="21"]/@charlength .
最后一个例子:字段 21/子字段 2 的分解。这是子字段 2 的图片
ABC 08 12345678
| | |
| | v
| | This is the payload. It is output as the text node child of output
| | subfield 2
| v
v Length of the following payload
Signature. The length and value is equal to the mapping node
Root/field[@no="21"]/subfield[@no="2"]/@idcode