0

この 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>子供たちの変容を達成できますか?

ここで正しいアプローチは何ですか?

4

1 に答える 1

1

これがうまくいくかどうかを確認してください:

  override def transform(n: Node): Seq[Node] = n match {

    case el @ Elem(_, "item", _, _, _*) =>
      val children = el.child
      val disc = children.find(_.label == "discriminator")
      val content = children.collect{
        case el @ Elem(_, "target", _, _, _*) =>
          <target>{el.text + disc.map(_.text).getOrElse("")}</target>
        case e:Elem => e
      }
      <item>{content}</item>

    case el @ Elem(_, "incomplete", _, _, _*) =>  
      <incomplete>some content</incomplete>
    case other => other
  }

xml 構造は不変であるため、特定の要素にいるときは、その親にアクセスできません。itemそのため、代わりに停止して子コンテンツを置き換えることで、問題#1にアプローチすることにしました。これがあなたが探していたものであることを願っています。

于 2013-05-14T16:01:52.183 に答える