验证XML模式中的xml:id属性

时间:2018-08-20 03:03:11

标签: xml xsd schema

我对XML和一般的编码还很陌生。

我正在尝试使用组合在一起的模式来验证XML标记。我的元素之一利用xml:id属性。看起来像这样:$value = strip_tags($test123); if (strcmp(trim($value),'APPROVAL')==0) { echo 'Transaction is APPROVED!';} else{ echo 'Transaction is DECLINED';} 。在我的模式中,我在元素声明中遵循了推荐的结构,并带有<item xml:id="MAT_10_23">。这是完整的:

<xs:attribute name="id" type="xs:ID"/>

但是,当我尝试验证其标记时,系统提示“属性xml:id不允许出现在元素中”。我试过在架构中分别声明属性。看起来像这样:

<xs:element name="item">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="label">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:ID"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>

但这不会改变任何东西。要成功验证XML标记,我需要在架构中进行哪些更改?

1 个答案:

答案 0 :(得分:0)

当您希望属性位于XML名称空间中时,您已经在无名称空间中声明了具有本地名称id的属性。您需要:

(a)用

替换属性声明
<xs:attribute ref="xml:id"/>

(b)为XML命名空间的模式添加xs:import(包含此属性的声明):

<xs:import namespace="http://www.w3.org/XML/1998/namespace"/>

您可能还需要添加一个schemaLocation属性以提供此架构文档的副本的位置-一些架构处理器会识别名称空间并知道在哪里可以找到其定义,但是我不认为所有处理器都是如此。