我无法将包 hxt 哄骗到构建一个正确表示默认XML- 属性的DTD。
pickler 中包含的DTD错误地要求属性的显式值,并为其定义了默认值。 pickler 在解析未经验证的输入时正确应用默认值,但在根据DTD验证输入时失败,这需要显式的属性 -value。
作为使用 ghci 的示例,我为属性创建 pickler &定义默认值,然后提取DTD,指定值 REQUIRED 。 如果定义默认值TWICE,那么奇怪的是DTD定义该值为 IMPLIED 。 如果有人将值定义为元素而不是属性,则DTD将值量化为“?”,表明它是可选的;更好,但我想要一个属性。
Prelude> :m + Text.XML.HXT.Core
Prelude Text.XML.HXT.Core> _ <- runX $ constA undefined >>> xpickleWriteDTD (xpElem "root" . xpDefault 0 $ xpAttr "attr" xpInt) [] "-" --There's probably an easier way of achieving this.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root EMPTY >
<!ATTLIST root attr CDATA #REQUIRED >
]>
Prelude Text.XML.HXT.Core> _ <- runX $ constA undefined >>> xpickleWriteDTD (xpElem "root" . xpDefault 0 . xpAttr "attr" $ xpDefault undefined xpInt) [] "-"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root EMPTY >
<!ATTLIST root attr CDATA #IMPLIED >
]>
Prelude Text.XML.HXT.Core> _ <- runX $ constA undefined >>> xpickleWriteDTD (xpElem "root" . xpDefault 0 $ xpElem "elem" xpInt) [] "-"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT elem (#PCDATA) >
<!ELEMENT root (elem)? >
]>
答案 0 :(得分:1)
我收到了该软件包的作者的回复,该回复阐明了该问题;
我怀疑,使用当前版本的 HXT ,无法在 pickler 模块中描述属性的默认值。从 picklers 中导出DTD的功能在某种程度上是实验性的,我们还没有实现DTD中可用的每个角落情况。在 picklers 中用于架构信息(DTD或其他架构)的数据类型中,没有包含默认属性值的字段。