在 Windows 10 上,我使用 OpenSP 中的 osx.exe 将 SGML 文件转换为 XML。 在 SGML 中,有 html 实体,如
–
é
等等。
解析器强迫我声明它们:
对无法生成系统标识符的实体“ndash”的引用
因此,在我的 DTD 中,我尝试将它们声明如下:
<!ENTITY ndash "–">
但是后来我得到了这个错误:
“8211”不是文档字符集中的字符编号
最后,我测试了添加角色本身:
<!ENTITY ndash "–">
我得到了这些错误:
非 SGML 字符数 226
非 SGML 字符号 8364 非 SGML
字符数8220
如何处理 SGMl-> XML 转换中的那些 HTML 实体?
很难判断何时不包含
osx
抱怨的 SGML,但您收到的这些错误消息是因为 osx
假设了不正确的文档字符集。最有可能的是,osx
被告知在文件开头采用所谓的 SGML 声明 或 SGML 声明引用 假定文档字符集,尽管理论上 osx
可能采用另一个默认字符集在您的特定语言环境中,Windows 计算机会被赋予类似 Windows 的字节顺序标记,或者通过目录解析规则导出 SGML 声明。
或者至少,当使用以下具有隐式 SGML 声明默认值的测试文档运行时,
osx
在我的 Unix 机器上不会抱怨:
<!DOCTYPE test [
<!ENTITY ndash "–">
<!ELEMENT test - - (#PCDATA)>
]>
<test>–</test>
有关 SGML 声明的详细说明,请参见示例。 https://sgmljs.net/docs/sgmlrefman.html#sgml-declaration。注意 sgmljs.net SGML 支持 ISO 8879 附件 K(又名 WebSGML),并在 SGML 声明中使用 HTML 的预定义实体,如 https://sgmljs.net/docs/w3c-html51-sgmldecl.html 中所述,但是对于 OpenSP 的
osx
,它不(完全)支持 WebSGML,您需要将它们声明为 DTD 中的实体,就像您已经做的那样。偶尔,您可以通过将它们声明为 SDATA
实体来回避问题,以使错误消息消失;也就是说,通过将它们声明为
<!ENTITY ndash SDATA "–">
如果这不起作用,或者生成的输出文件引起问题,您可以包含以下取自 https://sgmljs.net/docs/sgmlrefman.html#sgml-declaration-for-html5 的 SGML 声明作为SGML 中的第一件事。重要的部分是
160 55136 160
(描述的字符集)部分中的 DECSCET
行,告诉 SGML 解析器文档中允许使用 UCS 代码点 160 到 55136。请注意,假定 BASESET
为 UTF-8,它可能与您的文档数据匹配,也可能不匹配;此外,此 SGML 声明会启用标签推断、属性名称省略和其他适用于 HTML 但不一定是您的 SGML 的选项;我无从得知。
<!SGML "ISO 8879:1986 (WWW)"
CHARSET
BASESET "ISO Registration Number 177//CHARSET
ISO/IEC 10646-1:1993 UCS-4 with
implementation level 3//ESC 2/5 2/15 4/6"
DESCSET 0 9 UNUSED
9 2 9
11 2 UNUSED
13 1 13
14 18 UNUSED
32 95 32
127 1 UNUSED
128 32 UNUSED
160 55136 160
55296 2048 UNUSED -- SURROGATES --
57344 1056768 57344
CAPACITY SGMLREF
TOTALCAP 150000
GRPCAP 150000
ENTCAP 150000
SCOPE DOCUMENT
SYNTAX
SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127
BASESET "ISO 646IRV:1991//CHARSET
International Reference Version
(IRV)//ESC 2/8 4/2"
DESCSET 0 128 0
FUNCTION
RE 13
RS 10
SPACE 32
TAB SEPCHAR 9
NAMING LCNMSTRT ""
UCNMSTRT ""
LCNMCHAR ".-_:"
UCNMCHAR ".-_:"
NAMECASE GENERAL YES
ENTITY NO
DELIM GENERAL SGMLREF
HCRO "&#x" -- ampersand --
NESTC "/"
NET ">"
SHORTREF SGMLREF
NAMES SGMLREF
QUANTITY SGMLREF
ATTCNT 120 -- increased for HTML 5 --
ATTSPLEN 65536 -- These are the largest values --
LITLEN 65536 -- permitted in the declaration --
NAMELEN 65536 -- Avoid fixed limits in actual --
PILEN 65536 -- implementations of HTML UA's --
TAGLVL 100
TAGLEN 65536
GRPGTCNT 150
GRPCNT 150 -- increased for HTML 5 --
FEATURES
MINIMIZE DATATAG NO
OMITTAG YES
RANK NO
SHORTTAG
STARTTAG EMPTY NO
UNCLOSED NO
NETENABL IMMEDNET
ENDTAG EMPTY NO
UNCLOSED NO
ATTRIB DEFAULT YES
OMITNAME YES
VALUE YES
EMPTYNRM YES
IMPLYDEF ATTLIST YES
DOCTYPE NO
ELEMENT YES
ENTITY NO
NOTATION NO
LINK
SIMPLE NO
IMPLICIT NO
EXPLICIT NO
OTHER
CONCUR NO
SUBDOC NO
FORMAL NO
URN NO
KEEPRSRE YES
VALIDITY NOASSERT
ENTITIES
REF ANY
INTEGRAL NO
APPINFO NONE
>
<!-- your instance document following here eg.: -->
<!DOCTYPE test [
<!ENTITY ndash "–">
<!ELEMENT test - - (#PCDATA)>
]>
<test>–</test>