编写XSD以在目标XML中不使用名称空间
如何修改这个XSD模式,使其在XML中不使用名称空间声明来验证XML文件 当候选XML包含相同名称空间的声明时,模式会进行验证,但是如果不必首先编辑候选文档,那么工作流显然会更容易 我肯定我错过了一些简单的东西,但一个小时的猜测并没有扭转局面 模式--data.xsd编写XSD以在目标XML中不使用名称空间,xml,xsd,Xml,Xsd,如何修改这个XSD模式,使其在XML中不使用名称空间声明来验证XML文件 当候选XML包含相同名称空间的声明时,模式会进行验证,但是如果不必首先编辑候选文档,那么工作流显然会更容易 我肯定我错过了一些简单的东西,但一个小时的猜测并没有扭转局面 模式--data.xsd <schema xmlns=xsd:"http://www.w3.org/2001/XMLSchema" xmlns:target="http://myurl.com/response" targetNamesp
<schema
xmlns=xsd:"http://www.w3.org/2001/XMLSchema"
xmlns:target="http://myurl.com/response"
targetNamespace="http://myurl.com/response"
elementFormDefault="qualified">
<xsd:element name="response">
<xsd:complexType mixed="true" name="response">
<xsd:all>
<xsd:element name="item">
<xsd:complexType>
<xsd:sequence>
<xsd:any namespace="##any"
processContents="lax"
minOccurs="0"
maxOccurs="unbounded" /xsd:>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="activities" >
<xsd:complexType>
<xsd:sequence>
<xsd:any namespace="##any"
processContents="lax"
minOccurs="0"
maxOccurs="unbounded" /xsd:>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!-- et cetera -->
</xsd:all>
</xsd:complexType>
</xsd:element>
</xsd:schema>
提前感谢。从
xsd:schema
中删除targetNamespace
属性。然后还可以删除elementFormDefault
,因为在没有目标名称空间的情况下,它没有任何区别
在原始模式中,使用targetNamespace
这样的声明
<xsd:element name="response">
声明一个元素,其本地名称为response
,命名空间URI为http://myurl.com/response
。名称空间URI是元素的完全限定名称的一个组成部分,因此模式不会验证具有相同本地名称但具有不同(或空)名称空间的元素
相反,如果删除目标命名空间,则架构将验证非命名空间文档,但不会验证命名空间文档。Boom。请解释为什么targetNamespace会出现问题。啊。因此,使用{targetNamespace}修改元素的完全限定名,但方式不那么容易看到。我发现这有点令人困惑——模式没有定义名称空间吗?但我想答案是,不,或者至少不是完全。它是为特定名称空间定义结构。但是是否要求受该结构约束的元素已经是该名称空间的一部分是一个选择,这是由targetNamespace的行为所实现的。欢迎来到混乱的名称空间世界。
<?xml version="1.0" encoding="utf-8"?>
<response>
<item>
<! -- valid stuff -->
</item>
<activities>
<! -- valid stuff -->
</activities>
</response>
xmllint --noout --schema data.xsd data.[namespaced.].xml
<xsd:element name="response">