使用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文件?
答案 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