DTD 属性可以是固定的并且是必需的吗?
<!ATTLIST myTag myAttribute CDATA #FIXED #REQUIRED "some text">
Daniel Haley 是正确的,至少在 DTD 的语法方面是正确的。
如果您希望所有出现的属性都具有给定值,并且您希望该值物理存在于 XML 文档中(默认值机制不存在),并且如果该值是合法的 NMTOKEN,则您可以通过不同的途径实现您想要的行为:
<!ATTLIST myTag
myAttribute (some-text) #REQUIRED >
这里的属性类型信息(some-text)
指定唯一有效的值myAttribute
is some-text
,并且#REQUIRED
关键字强加了myAttribute
必须物理存在于输入中的约束。
如果您想要的值不是合法的 NMTOKEN——例如,如果它是绝对 URI,或者其中包含空格或非名称字符的短语——那么这种技术将不起作用。
不,属性声明不能同时具有#FIXED
和#REQUIRED
。
如果属性是#FIXED
,则该值始终是声明中指定的值,即使该属性实际上不在 XML 中。
例如,在以下 XML 中,该属性的值test
是bar
即使该属性实际上并未在 XML 本身中指定:
<!DOCTYPE foo [
<!ELEMENT foo EMPTY>
<!ATTLIST foo
test CDATA #FIXED 'bar'>
]>
<foo/>
这是通过 XSLT 转换的证明:
XSLT 2.0(它也是有效的 1.0)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/foo">
<results>
<xsl:value-of select="@test"/>
</results>
</xsl:template>
</xsl:stylesheet>
输出
<results>bar</results>