ノードの更新

www.altova.com このトピックを印刷 前のページ 1つ上のレベル 次のページ

ホーム >  アクション > データの更新 >

ノードの更新

ノードの更新 アクションは指定された値をもつ 1 つ以上の指定されたノードを更新します。ノードの更新と値の更新は XPath 式により指定されます。下のスクリーンショットでは、コンテキスト要素の @Updated 属性ノード が現在の日付と共に更新されています ( XPath 関数 current-date-no-TZ()の評価の結果)。

MTDUpdateNode01

ノードの更新および値の更新を指定する時に注意点があります:

 

相対パスに対するコンテキスト ノードの重要性(詳細に関しては 下記 を参照してください)。
更新のターゲットノードは $MT_TargetNode 変数により参照される場合があります (詳細に関しては 下記 を参照してください)。
ソースノードが混在コンテンツ (テキストと要素) を持つ要素である場合、 混在コンテンツ要素のテキストのみが更新に使用されます。子孫要素のテキスト コンテンツは無視されます。 (詳細に関しては 下記 を参照してください)。
複数のターゲットノードは配列を介して指定することができます(詳細に関しては 下記 を参照してください)。

 

相対パスに対するコンテキスト ノードの重要性

更新されるノードが相対パスとして指定される場合、コンテキストノードの子孫であるノードのみが更新されます。兄弟要素の子孫を更新するには、絶対ロケーターパスが必要です。 この点に関しては下で説明されています。

 

下のスクリーンショットでは、(コンテキスト フィールドで指定されている) コンテキスト ノードは DB の Row 要素です。 コンテキスト ノードは (アクションが定義される) コントロール内のノードで ロケートされます (またはコントロールが関連付けられます)。
更新される@Updated 属性は、ですから、その特定の Row 要素の @Updated 属性です。これは、 Row 要素のコントロール イベントがトリガーされると、この場合、現在の日付と共に、  Row 要素のみの@Updated 属性 が更新されます。

Click to expand/collapse

XPath 式が、@Updated ノードがルートノードから開始されるようにアドレスするよう変更されると、 (以下のスクリーンショットのように : $DB2/DB/RowSet/Row/@Updated) すべての Row 要素の @Updated ノード  が更新されます。

Click to expand/collapse

上のスクリーンショットで、 XPath 式によりページソースのすべてのノードにアクセスすることができることを確認してください。

 

$MT_TargetNode を使用して特定のターゲットノードを更新する

更新のためのターゲットノードが定義されると、$MT_TargetNode 変数と共にこのノードを参照することができます。例えば:
 
ノードの更新 : @Updated
値の更新: concat(current-date-no-TZ(), '-ID-', $MT_TargetNode/../@id)

 

値の更新は、現在の日付にサフィックスされた現在の Row 要素の @id 属性の値を持つことが下のスクリーンショットに表示されています。

MTDUpdateNodeXP03

ノードの更新がすべてのRow要素の @Updated 属性で、値の更新の XPath 式は、前の例と同じです:
 
ノードの更新 : $DB2/DB/RowSet/Row/@Updated
値の更新: concat(current-date-no-TZ(), '-ID-', $MT_TargetNode/../@id)

 

Row 要素の @Updated 属性は、現在の日付にサフィックスされた自身の Row 要素 @id 属性値 を持つ値をもちます。

 

$MT_TargetNode を使用してノードを変更し、更新する方法

$MT_TargetNode 変数は1つのジョイントアクションとしてノードを変更し更新する際にとても役に立ちます。サンプルが下のスクリーンショット内で表示されています。

MTDUpdateNodeMTTargetNode

スクリーンショット内のアクションは以下のように作動します:

 

変更されるノードは現在の要素のすべての属性です。これらのノードは 変更ノード: @* の  XPath 式により指定されています。
各属性が処理されると、 $MT_TargetNode の件名になります。
結果 設定は上記は、上記のサンプルでは、 ($MT_TargetNode により取得された)属性のオリジナルの値であるノードの値を指定し更新します。 trim-string XPath 関数により先頭または末尾の空白が削除されています。
結果全体としては、各属性の先頭または末尾の空白が削除されています。

 

混在コンテンツを持つソース要素

混在したコンテンツ (テキストと要素)付きの要素が XPath ロケーター式によりロケートされる場合、混在したコンテンツ要素のテキストコンテンツのみが返されます。子孫要素のテキストコンテンツは無視されます。

 

ノードの更新アクションの例により最もよく説明されています。下のスクリーンショットで定義される ノードの更新アクション を熟考してください。

XPathMixedElementNonCompliance

XML ツリーが次の構造とコンテンツを持つ場合:

 

<Element1>

   <source>AAA

      <subsource>BBB</subsource>

  </source>

  <target></target>

</Element1>

 

子要素 subsource のコンテンツを無視する一方、混在コンテンツ要素 source のテキストコンテンツと共に、target 要素が更新されます。target という名のノードは、<target>AAA</target>に更新されます。

 

メモ:子孫ノードのテキスト コンテンツを含みたい場合、空の文字列付きの concat 関数を第 2 番目の引数として使用します。上の XML 例を使用することにより、たとえば、式 concat($XML1/Element1/source, '')"AAABBB" を返します。

 

メモ:XPath 対応メソッドのシリアル化を使用するチャート: 混在コンテンツ要素が XPath ロケーター式を使用してロケートされる場合、子孫要素のテキスト コンテンツもシリアル化されます。

 

XPath 配列を介して複数のノードを更新する方法

複数のノード (ターゲットノード) を XPath 配列を介してこれらのノードをロケートして更新することができます。更新値は、ターゲットノード配列と同じサイズを持つ配列として提出する必要があります。1:1 とメンバー間で更新は発生します: 値の配列の最初のメンバーは、ターゲット配列の最初のメンバーなどを更新します。 例:

 

Update Node : $XML1/User/Message/[@subject, @date, @senderID]
Update Value: ['Monthly Meeting June', '2018-05-31', 3485]

 

以下の点に注意してください:

 

$MT_TargetNode 変数は、ターゲットノードを識別する配列に設定されています。科のように変数に配列が含まれるかをチェックすることができます : if($MT_TargetNode instance of array(*)) then...
配列の検証とマッピングが最初に実行されます。 割り当てはグループとして次に実行されます。これは、ターゲットノードの値を入力として使用できることを意味します。
ターゲット配列の各メンバーは個別に処理されます。この結果、ターゲット配列の一つのメンバーがエラーを生成すると他のターゲットノードの更新が継続されますが、(自身で、または、値の評価中に) 適切なエラーメッセージが生成されます。

 

 

 


(C) 2019 Altova GmbH