[ruby-list:50735] Re: 2.6.0でREXML::XPath.matchの振る舞いが変わった?

From: Kouhei Sutou <kou@...>
Date: 2018-12-31 22:07:43 UTC
List: ruby-list #50735
須藤です。

In <20181226.205303.1284198911746699450.kou@clear-code.com>
  "[ruby-list:50732] Re: 2.6.0でREXML::XPath.matchの振る舞いが変わった?" on Wed, 26 Dec 2018 20:53:03 +0900 (JST),
  Kouhei Sutou <kou@clear-code.com> wrote:

> で、今回のやつはマッチしなければいけないのにマッチしていない
> やつなので、REXMLのバグです。ごめんなさい。
> 
> 2.6からはgem install rexmlで新しいバージョンを使えるようにな
> るので少々お待ちください。

REXML::XPath.match(doc, "//*[@null:id='test']", {'null' => ''})

でもマッチするようにしたREXML 3.2.0をリリースしました。

> 以下が"http://www.w3.org/1999/xhtml"を返すのが悪い気がしてい
> ますけど、これを変えると互換性が壊れるんですよねぇ。。。
> 
> p doc.root.elements["body"].attribute("id").namespace

非互換になるのですが、属性のデフォルトネームスペースの扱いの
修正も入っています。以下がどちらも""を返すようになります。
(前はprefixの方は"xhtml"を返して、namespaceの方は
"http://www.w3.org/1999/xhtml"を返していました。)

--
require "rexml/document"
doc = REXML::Document.new(<<XML)
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <head>
  </head>
  <xhtml:body id="test">
  </xhtml:body>
</html>
XML

p doc.root.elements["body"].attribute("id").prefix
# "xhtml" -> ""
p doc.root.elements["body"].attribute("id").namespace
# "http://www.w3.org/1999/xhtml" -> ""
--

もし、これで既存のアプリケーションが動かなくなるようなら変更
を戻そうかとも考えているのでそういうのがあったら教えてくださ
い。

非互換にするのは嫌だったのですが、XML(ネームスペース)の仕
様で正しいとされている次のXMLがパースエラーになるのはXMLパー
サーとしては深刻なバグだろうと思ったので直しました。

https://www.w3.org/TR/xml-names/#uniqAttrs

<!-- http://www.w3.org is bound to n1 and is the default -->
<x xmlns:n1="http://www.w3.org"
   xmlns="http://www.w3.org" >
  <good a="1"     b="2" />
  <good a="1"     n1:a="2" />
</x>

In This Thread

Prev Next