DTD实体与XML-Schema元素

时间:2009-07-29 23:44:51

标签: xml xslt xsd entity dtd

使用Document DTD我做了以下事情:

file.xsl:

<!DOCTYPE xsl:stylesheet[
  <!ENTITY red "rgb(255,0,0)">
]>

<xsl:stylesheet>
   [...]
   <xsl:attribute name="color">&red;</xsl:attribute>
   [...]
</xsl:stylesheet>

我想将所有内容都更改为XML-Schema。所以我试过了:

file.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="red" type="xs:token" fixed="rgb(255,0,0)" />
</xsd:schema>

file.xsl:

<xsl:stylesheet
    xmlns:defs="http://www.w3.org/2001/XMLSchema-instance"
    defs:noNamespaceSchemaLocation="file.xsd">

    [...]
    <xsl:attribute name="color"><defs:red/></xsl:attribute>
    [...]
</xsl:stylesheet>

现在通过Xalan red解析文件并不像DTD版本那样进行翻译。我的错误在哪里?在解析过程中是否未读取Schema文件?

2 个答案:

答案 0 :(得分:6)

元素定义中的fixed属性不会告诉解析器进行文本替换。它只是意味着元素的值必须始终相同。

事实上,我相信您的XSLT正在生成不会针对您的架构进行验证的XML,因为<defs:red>元素的值不是“rgb(255,0,0)”。即使您使用default代替fixed,也不是文字替换。它只是意味着,如果没有指定值,当在DOM实例中查询该值时,您会发现该值设置为“rgb(255,0,0)”。

答案 1 :(得分:4)

使用模式声明结构规则(而不是DTD)并不妨碍您使用实体。

使用实体引用替换声明的内容的方式不会改变。

实体引用不需要仅在DTD文件中声明。您可以在XML文件中内联声明它们。

<?xml version="1.0"?>
<!DOCTYPE foo [
  <!ENTITY red "rgb(255,0,0)">
]>
<foo>
  <bar color="&red;" /> 
</foo>

http://www.ibm.com/developerworks/xml/library/x-tipentref.html