【问题标题】:Can a DTD attribute be fixed AND required?DTD 属性可以固定和必需吗?
【发布时间】:2013-04-04 01:08:09
【问题描述】:

DTD 属性是否可以固定和必需?

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

【问题讨论】:

    标签: xml dtd


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        相关资源
        最近更新 更多