Subject: Re: bug#8516: nxml-mode: pattern matching should be case-sensitive in validation

From: Lawrence Mitchell <[email-masked]>
Date: Mon, 18 Apr 2011 11:52:42 +0100

Rob Browning wrote:
> (If possible, please preserve the 288147-forwarded address in any replies.)

> Vincent Lefevre <[email-masked]> writes:

>> Consider the following example:

>> ay:~> cat test.xml
>> <?xml version="1.0"?>
>> <root>Test</root>
>> ay:~> cat test.rnc
>> default namespace = ""
>> start = element root { xsd:normalizedString { pattern = "[a-z]*" } }

>> When test.xml is opened in emacs, nxml-mode says that the file is valid,
>> though the root element contains a "T". If I add ASCII letters (either
>> lowercase or uppercase), it still says that the file is valid, but as
>> soon as I add a non-letter character, nxml-mode says that the file is
>> invalid, as expected.

>> As a comparison, here's what I get with xmllint:

>> ay:~> trang test.rnc test.rng
>> ay:~> xmllint --noout --relaxng test.rng test.xml
>> test.xml:2: element root: Relax-NG validity error : Error validating
>> datatype normalizedString
>> test.xml:2: element root: Relax-NG validity error : Element root
>> failed to validate content
>> test.xml fails to validate

> Please see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=288147 for
> further information.

The various string-checking functions in rng-xsd.el probably need
to wrap string-match calls in a (let ((case-fold-search nil))
...)

To fix this particular problem, replace rng-xsd-check-pattern by:

(defun rng-xsd-check-pattern (str regexp convert &rest args)
  (let ((case-fold-search nil))
    (and (string-match regexp str)
         (apply convert (cons str args)))))

Lawrence
-- 
Lawrence Mitchell <[email-masked]>