2012-01-02 4 views
3

値に '+'文字が含まれているエンティティを定義しようとしていますが、そうした場合、さらに奇妙なエラーメッセージが表示されます。 +文字を削除すると、すべて正常に動作します。私はそれをエスケープする方法を見つけることができないようです。
私が現在使用しているライブラリではなく、http://www.validome.org/grammar/validate/ 短いサンプルでのオンラインバリデータだけではなくエラーが表示されます。DTDエンティティで '+'などの特殊文字を使用する

<?xml version="1.0" encoding="UTF-8"?> 

<!ENTITY % Foo "BAR"> <!--No problem here--> 
<!ENTITY % Baz "QUUX+QUUUX"> <!--This will cause trouble later on--> 

<!ENTITY % FooBazType "(%Foo; | %Baz;)"> 

<!ELEMENT tagName EMPTY> 
<!ATTLIST tagName attributeName %FooBazType; #REQUIRED> <!--Here, you get the error message : The enumerated type list must end with ')' in the "attributeName" attribute declaration.--> 

誰もが(+文字を取得する方法を知っていますかその場所に+文字が含まれているXML文書を正しく検証するもの)を何らかの形でそこに格納していますか?前もって感謝します!

+0

シンボルが有効であること、Unicode文字を参照しようとしていると考えていますか? – Joe

+1

私が知る限り、数値エスケープシーケンス(+)を使ってみましたが、それもうまくいきませんでした。さらなる研究がNMTOKEN(http://www.w3.org/TR/xml/#NT-Nmtoken)というコンセプトを生み出しました。それはプラスを除外しているように見えます...私が私が最初であるとは信じられません+文字はあまり一般的ではないので、この問題に遭遇する人は? – user1126518

+0

私は '$' char(hex = 0x24)と全く同じ問題を抱えています。 – Marek

答えて

1

問題はエンティティ自体ではなく、legal values are enumeratedという属性を定義するために使用されるという事実です。このような値は、Nmtoken(1つ以上のNameChar)に一致する必要があります。それはthe definition of NameCharの一部ではない '+'と '$'を除外します。下の例はこれを示しています。

plus.dtd:

<!ELEMENT tagName EMPTY> 
<!ATTLIST tagName 
      attributeName (BAR | FOO+BAZ) #REQUIRED> 

plus.xml:

<tagName attributeName="FOO+BAZ"/>  

xmllint出力plus.dtdに対してplus.xmlを検証しようとしている:

xmllint --dtdvalid plus.dtd plus.xml 
<?xml version="1.0"?> 
<tagName attributeName="FOO+BAZ"/> 
plus.dtd:2: parser error : ')' required to finish ATTLIST enumeration 
<!ATTLIST tagName attributeName (BAR | FOO+BAZ) #REQUIRED> 
             ^
plus.dtd:2: parser error : Space required after the attribute type 
<!ATTLIST tagName attributeName (BAR | FOO+BAZ) #REQUIRED> 
             ^
plus.dtd:2: parser error : Content error in the external subset 
<!ATTLIST tagName attributeName (BAR | FOO+BAZ) #REQUIRED> 
             ^
Could not parse DTD plus.dtd 

固定属性値に '+'または '$'を使用するとOKです。

plus2.dtd:

<!ELEMENT tagName EMPTY> 
<!ATTLIST tagName 
      attributeName CDATA #FIXED "FOO+$BAZ"> 

xmllint出力(エラーなし):

xmllint --dtdvalid plus2.dtd plus.xml 
<?xml version="1.0"?> 
<tagName attributeName="FOO+$BAZ"/>