この XML を考えると:
<root>
<item>
<discriminator>d1</discriminator>
<target>t1</target>
<subitem>
<incomplete></incomplete>
</subitem>
<subitem>
<incomplete></incomplete>
</subitem>
</item>
<item>
<discriminator>d2</discriminator>
<target>t2</target>
<subitem>
<incomplete></incomplete>
</subitem>
</item>
</root>
次のように変換する必要があります:
1) 各<item>
について、 のテキストは<target>
のテキストに基づいて変更されます<discriminator>
。
2) ごと<incomplete>
に、いくつかのテキスト コンテンツを追加します。
RewriteRule
他の SO 投稿に基づいて、これまでのところ、2) の解決策を思いつきましたRuleTransformer
。こんなふうになります:
object completeIncomplete extends RewriteRule {
override def transform(n: Node): Seq[Node] = n match {
case Elem(_, "incomplete", _, _, _*) =>
<incomplete>content</incomplete>
case other => other
}
}
object transform extends RuleTransformer(completeIncomplete)
transform(xml)
これはうまくいくようですが、わかりません:
- 達成方法 1) (兄弟に基づいて要素を変更する)
- 2 つの処理ステップを組み合わせる方法。つまり、この場合、2 つの異なる RewriteRule-s を持つことは意味があるのでしょうか? その2つは無駄ですか?1回の繰り返しで両方の変換を達成することは可能ですか/お勧めですか?
1) については、次のように、子のリストのパターン マッチを試みました。
case Elem("", "item", _, _, disc@Elem("", "discriminator", _, _, _*))
if discriminate(disc) => //...?
またはこれ:
case item@Elem("", "item", _, _, _*)
if discriminate(item \ "disc") => //..?
しかし、交換だけでアイテム全体を再現する方法がわからないため、うまくいきませんでした<target>
この場合、照合<item>
が進むべきかどうかさえわかりません。しかし、もしそうなら、どうにかしてその<incomplete>
子供たちの変容を達成できますか?
ここで正しいアプローチは何ですか?