可以修复和需要DTD属性吗?

时间:2013-04-02 12:29:45

标签: xml dtd

DTD属性是否可以修复且必需?

<!ATTLIST myTag myAttribute CDATA #FIXED #REQUIRED "some text">

2 个答案:

答案 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>