1

DTD 属性可以是固定的并且是必需的吗?

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

2 回答 2

3

Daniel Haley 是正确的,至少在 DTD 的语法方面是正确的。

如果您希望所有出现的属性都具有给定值,并且您希望该值物理存在于 XML 文档中(默认值机制不存在),并且如果该值是合法的 NMTOKEN,则您可以通过不同的途径实现您想要的行为:

<!ATTLIST myTag 
   myAttribute (some-text) #REQUIRED >

这里的属性类型信息(some-text)指定唯一有效的值myAttributeis some-text,并且#REQUIRED关键字强加了myAttribute必须物理存在于输入中的约束。

如果您想要的值不是合法的 NMTOKEN——例如,如果它是绝对 URI,或者其中包含空格或非名称字符的短语——那么这种技术将不起作用。

于 2013-04-03T17:08:09.097 回答
2

不,属性声明不能同时具有#FIXED#REQUIRED

如果属性是#FIXED,则该值始终是声明中指定的值,即使该属性实际上不在 XML 中。

例如,在以下 XML 中,该属性的值testbar即使该属性实际上并未在 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>
于 2013-04-02T15:05:47.483 回答