为了测试在 XML 文档中转换 Text 元素的方法,我编写了两个非常简单的选择器,并在生成的 Zipper 上应用了 map/toUpperCase。结果应该是除了那些通过第一个选择器排除的文本元素之外的所有文本元素都转换为大写。但它仅适用于最下方的 Text 元素。这是代码:
scala> import com.codecommit.antixml._
import com.codecommit.antixml._
scala> val elemSelector = Selector({case x:Elem if x.name != "note" => x})
elemSelector: com.codecommit.antixml.Selector[com.codecommit.antixml.Elem] = <function1>
scala> val textSelector = Selector({case x:Text => x})
textSelector: com.codecommit.antixml.Selector[com.codecommit.antixml.Text] = <function1>
scala> val xml = XML.fromString("<tei><div><p>this<note>not<foreign lang=\"greek\">that</foreign>not</note></p><p>those<hi>these</hi></p></div></tei>")
xml: com.codecommit.antixml.Elem = <tei><div><p>this<note>not<foreign lang="greek">that</foreign>not</note></p><p>those<hi>these</hi></p></div></tei>
scala> val zipper = xml \\ elemSelector \ textSelector
zipper: com.codecommit.antixml.Zipper[com.codecommit.antixml.Text] = thisthatthosethese
scala> val modified = zipper.map(t => new Text(t.text.toUpperCase))
modified: com.codecommit.antixml.Zipper[com.codecommit.antixml.Text] = THISTHATTHOSETHESE
scala> val result = modified.unselect.unselect
result: com.codecommit.antixml.Zipper[com.codecommit.antixml.Node] = <tei><div><p>this<note>not<foreign lang="greek">THAT</foreign>not</note></p><p>those<hi>THESE</hi></p></div></tei>
因此,在倒数第二个命令中,将大写应用于所有目标文本元素,但在退出拉链后,四个元素中只有两个被转换。我已经尝试过,<hi/>
而不是<hi>these</hi>
然后those
被大写。知道这里有什么问题吗?
我正在为 Scala 2.10.3 使用 arktekk.no fork。