DTD属性是否可以修复且必需?
<!ATTLIST myTag myAttribute CDATA #FIXED #REQUIRED "some text">
答案 0 :(得分:3)
Daniel Haley是正确的,至少在DTD的语法方面是这样。
如果您希望所有出现的属性都具有给定值,和,您希望要求该值实际存在于XML文档中(默认值机制不存在), 和如果值是合法的NMTOKEN,那么您可以通过不同的路径实现所需的行为:
<!ATTLIST myTag
myAttribute (some-text) #REQUIRED >
此处,属性类型信息(some-text)
指定myAttribute
的唯一有效值为some-text
,而#REQUIRED
关键字强加了myAttribute
的约束必须实际存在于输入中。
如果您想要的值不是合法的NMTOKEN - 例如,如果它是绝对URI,或者其中包含空格或非名称字符的短语 - 那么这种技术将不起作用。
答案 1 :(得分:2)
不,属性声明不能同时包含#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>