我正在尝试定义一个值包含“+”字符的实体,但是如果我这样做,我会得到一个奇怪的错误消息。如果我删除+字符,一切正常。我似乎无法想办法逃避它。
我不仅使用我正在使用的库,而且还使用http://www.validome.org/grammar/validate/处的在线验证程序。
简短的样本:
<?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 :(得分:1)
问题不在于实体本身,而在于它用于定义legal values are enumerated的属性。此类值必须与Nmtoken
(一个或多个NameChar
s)匹配。这不包括'+'和'$',它们不属于the definition of NameChar
。以下示例说明了这一点。
plus.dtd:
<!ELEMENT tagName EMPTY>
<!ATTLIST tagName
attributeName (BAR | FOO+BAZ) #REQUIRED>
plus.xml:
<tagName attributeName="FOO+BAZ"/>
尝试针对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
在固定属性值中使用“+”或“$”即可。
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"/>