1

我正在尝试在由更多文件组成的xml文件上使用名称空间。

XML 模式

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
    version="1.0"
    attributeFormDefault="unqualified"
    elementFormDefault="qualified"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:mynamespace"
    targetNamespace="urn:mynamespace">

    <xsd:element name="main_element" type="typeMainElement" />

    <xsd:complexType name="typeMainElement">
        <xsd:sequence>
            <xsd:element name="inner_element" type="typeInnerElement" />
        </xsd:sequence>
    <xsd:attribute name="test_attribute" type="xsd:string" use="required" />
    </xsd:complexType>

    <xsd:complexType name="typeInnerElement">
        <xsd:sequence>
            <xsd:element name="description" type="xsd:string" minOccurs="0" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

主要 XML

<main_element test_attribute="value"
    xmlns:xi="http://www.w3.org/2001/XInclude"
    xmlns="urn:mynamespace">
    <inner_element>
        <description>Test</description>
    </inner_element>
</main_element>

使用XML Schema验证XML效果很好。但是,如果我尝试将XML的某些部分外包出去,那么依赖它就没有任何效果了。XInclude

拆分的 XML

<main_element test_attribute="value"
    xmlns:xi="http://www.w3.org/2001/XInclude"
    xmlns="urn:mynamespace">
    <xi:include href="simple_part.xml" />
</main_element>

包含的 XML

<inner_element>
    <description>Test</description>
</inner_element>

尝试验证拆分的 XML 会返回错误:

simple_part.xml:1:元素内部元素:架构有效性错误:元素“内部元素”:不需要此元素。预期是( {urn:mynamespace}inner_element )。

simple_main_element.xml 无法验证

似乎包含时失去了命名空间继承,因此包含的内容不再具有命名空间。

-- 我如何解决这个问题,而不是到处添加命名空间前缀?--

- 添加的问题:在包含来自另一个目录的情况下,如何解决问题,比如<xi:include href="subdir/simple_part.xml" />

4

1 回答 1

1

好吧,您似乎需要进行一些修改:

1) 在您的 XML 片段中,您需要声明与“主”文档相同的命名空间

 <inner_element xmlns="urn:mynamespace">
   <description>Test</description>
 </inner_element>

2) 在生成的文档中,xml:base会自动设置一个属性(参见 XInclude 规范,§4.5.5 和 C.1),因此您必须通过声明此属性并导入xml命名空间来在架构中声明它,如下所示:

   <xsd:schema
       version="1.0"
       attributeFormDefault="unqualified"
       elementFormDefault="qualified"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns="urn:mynamespace"
       targetNamespace="urn:mynamespace">

       <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/03/xml.xsd" />

       <xsd:element name="main_element" type="typeMainElement" />

       <xsd:complexType name="typeMainElement">
           <xsd:sequence>
               <xsd:element name="inner_element" type="typeInnerElement" />
           </xsd:sequence>
       <xsd:attribute name="test_attribute" type="xsd:string" use="required" />
       </xsd:complexType>

       <xsd:complexType name="typeInnerElement">
           <xsd:sequence>
               <xsd:element name="description" type="xsd:string" minOccurs="0" />
           </xsd:sequence>
           <xsd:attribute ref="xml:base"/>
       </xsd:complexType>
   </xsd:schema>

实体的替代解决方案

您需要在“主”文档的开头在 DOCTYPE 中声明(解析)实体,并使用引用而不是<xi:include>类似的:

<?xml version="1.0"?>
<!DOCTYPE main_element [
  <!ENTITY simple_part SYSTEM "simple_part.xml">
]>
<main_element test_attribute="value"
     xmlns:xi="http://www.w3.org/2001/XInclude"
     xmlns="urn:mynamespace">
   <!-- call a reference instead of xi:include -->
   &simple_part_1;
</main_element>

simple_part.xml 将正是您在原始帖子中所需要的:

<inner_element>
  <description>Test</description>
</inner_element>
于 2015-03-12T17:48:24.403 回答