提案どおり。ここで質問 を部分に分けています。
私の入力 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は次のことを伝えます
- フィールドには、固定、可変、サブフィールドを持つフィールド (固定と可変)、サブフィールドを持つフィールド (異なる形式) の 4 つのタイプがあります。
- フィールド番号 2 は可変フィールド (上記のとおり) であり、最初の 2 文字 (charlength 属性) はフィールドの長さを示します。
- フィールド 3 は固定で、合計 4 文字です。
- フィールド 21 はサブフィールド (固定および可変) を持つフィールドで、最初の 2 つの文字 (charlength) はフィールドの文字数を示します。
- すべての固定のもの (サブフィールド) が最初に発生し、その後に可変サブフィールドが続きます
- このサブフィールドは、常に idcode (21 のサブの場合は ABC) で始まり、その後に文字の長さ (charlength 属性)、サブフィールドが続きます。chars の長さは 0 にすることもできます
- すべての固定フィールドと可変フィールドが出現し、長さ 0 はサブフィールドがないことを示します (ポイントの上)。
- フィールド 63 は、フィールドの長さ (charlength 属性) に応じて、サブフィールド (さまざまな形式) を持つフィールドであり、さまざまな形式が可能です。
- フィールド 63 の場合、長さが 03 (最初の 2 文字、charlength 属性) の場合はフォーマット 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