Последующие RewriteRules не преобразовывают элементы, добавленные в предыдущем преобразовании - PullRequest
0 голосов
/ 05 сентября 2018
import scala.xml._
import scala.xml.transform.{RewriteRule, RuleTransformer}

object TransformIssue {
  def addNewElement(): RewriteRule = new RewriteRule {
    override def transform(n: Node): Seq[Node] = n match {
      case <element></element> => <element><new></new></element>
    }
  }

  def addThingElement(): RewriteRule = new RewriteRule {
    override def transform(n: Node): Seq[Node] = n match {
      case <element>{ children@_*}</element> => <element>{ children  }</element>
      case <new></new> => <new><thing></thing></new>
    }
  }

  def change(node: Node): Node =
    new RuleTransformer(
      addNewElement(),
      addThingElement()
    ).transform(node).head

  def changeWorkaround(node: Node): Node = {
    val out1 = new RuleTransformer(
      addNewElement()
    ).transform(node).head

    new RuleTransformer(
      addThingElement()
    ).transform(out1).head
  }

}

-

import org.scalatest.{FlatSpec, FunSpec}
import org.scalatest._

class TransformIssueSpec extends FlatSpec with Matchers {

  it should "apply transform to created elements" in {
    val output = TransformIssue.change(<element></element>)
    output should be(<element><new><thing></thing></new></element>)
  } // fails

  it should "work the same as the workaround imo" in {
    TransformIssue.change(<element></element>) should equal(TransformIssue.changeWorkaround(<element></element>))
  } // fails

}

Когда мы применяем преобразование с двумя правилами перезаписи: первое добавляет новый элемент, второе добавляет дочерние элементы к новому элементу; тогда второе правило перезаписи не соответствует элементам, добавленным в первое правило.

Когда мы применяем одинаковые RewriteRules в двух отдельных RuleTransformers, это добавляет дочерние элементы к элементам, добавленным на первом шаге. Мы ожидаем, что функции change и changeWorkaround будут выдавать одинаковый вывод.

Проблема поднята в scala xml

...