3

我尝试验证这一点(XSD:http ://www.imsglobal.org/xsd/imsrdceo_rootv1p0.xsd ):

<?xml version="1.0" encoding="utf-8"?>
<rdceo xmlns="http://www.imsglobal.org/xsd/imsrdceo_rootv1p0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/imsrdceo_rootv1p0 http://www.imsglobal.org/xsd/imsrdceo_rootv1p0.xsd http://www.w3.org/XML/1998/namespace http://www.w3.org/2001/xml.xsd">
    <identifier>5040d336776eb</identifier>
    <title>
        <langstring xml:lang="en">titre</langstring>
    </title>
</rdceo>

但它说(在各种网站和我的 PHP 代码上):

不允许使用属性“xml:lang”

这是我的PHP代码。

<?php

class RDCEOObjectiveBuilder {

    public  $id,
            $title,
            $description;

    public function build() {
        $dom = new DOMDocument('1.0', 'utf-8');

        $root = $dom->createElementNS(
            'http://www.imsglobal.org/xsd/imsrdceo_rootv1p0',
            'rdceo'
        );
        $root->setAttributeNS(
            'http://www.w3.org/2000/xmlns/' ,
            'xmlns:xsi',
            'http://www.w3.org/2001/XMLSchema-instance'
        );
        $root->setAttributeNS(
            'http://www.w3.org/2001/XMLSchema-instance',
            'xsi:schemaLocation',
            'http://www.imsglobal.org/xsd/imsrdceo_rootv1p0 http://www.imsglobal.org/xsd/imsrdceo_rootv1p0.xsd http://www.w3.org/XML/1998/namespace http://www.w3.org/2001/xml.xsd'
        );

        $id = $dom->createElementNS('http://www.imsglobal.org/xsd/imsrdceo_rootv1p0', 'identifier', $this->id);

        $title = $dom->createElementNS('http://www.imsglobal.org/xsd/imsrdceo_rootv1p0', 'title');
        $title_lang = $dom->createElementNS('http://www.imsglobal.org/xsd/imsrdceo_rootv1p0', 'langstring', $this->title);
        $title_lang->appendChild(new DOMAttr('xml:lang', 'en'));
        $title->appendChild($title_lang);

        $root->appendChild($id);
        $root->appendChild($title);
        $dom->appendChild($root);

        $dom->schemaValidate('imsrdceo_rootv1p0.xsd');
        $dom->formatOutput = true;
        return $dom->saveXML();
    }
}

$test = new RDCEOObjectiveBuilder();
$test->id = uniqid();
$test->title = 'titre';
echo $test->build();
?>

我不明白为什么xml:lang不允许......在http://www.imsglobal.org/competencies/(创建xsd的人)上的每个示例中,他们使用xml:lang

示例:http ://www.imsglobal.org/competencies/Examples/MadeUp_Examplev1.xml

你能告诉我为什么吗 ?非常感谢 !

4

2 回答 2

3

元素langstring定义如下:

<xs:anyAttribute namespace="##other" processContents="strict"/>

这意味着当且仅当您的模式中存在该属性的属性声明时,它才允许来自另一个命名空间的属性。由于它们不导入 XML 命名空间的架构,因此架构中没有 xml:lang 的声明,除非您采取措施将其包含在内。我不熟悉您正在使用的 PHP 接口,因此我无法告诉您实现这一目标的最佳方法,但一种方法是定义一个模式文档 D,该文档同时导入 imsglobal 模式和 XML 命名空间的模式,并使用 D 作为验证实例的架构。

另一种方法是引用的示例执行此操作的方式:它们从实例文档中的 xsi:schemaLocation 属性引用 XML 命名空间。

于 2012-08-31T19:01:36.040 回答
1

这里的关键是在langstring元素上使用 xs:anyAttribute,它是严格的处理子句,以及xml:lang应该如何工作。

严格意味着XML 处理器必须获取所需名称空间的模式并验证来自这些名称空间的任何属性。

问题是,任何体面的 XML Schema 处理器都应该内置对我所谓的基本模式的支持;描述 xml:lang 的xml.xsd只是其中之一。

就我而言,使用QTAssistant,您的 XML 验证就好了。

我可以告诉你,如果他们(架构作者)将 xsd:import 包含到http://www.w3.org/XML/1998/namespace,即使没有架构位置,它也会帮助其他处理器,甚至可能明确引用受 i18n 约束的内容的 xml:land 属性。

但是他们没有……您现在可以做的是使用您编写的另一个 XSD 来导入您的和 xml.xsd,您应该没问题。请注意,不要在http://www.w3.org/2001/03/xml.xsd模式位置上导入,因为该链接会受到限制并且您会超时。有一个本地副本,然后到那个。像这样的东西:

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:import schemaLocation="..." namespace="http://www.imsglobal.org/xsd/imsrdceo_rootv1p0"/>
    <xsd:import schemaLocation="..." namespace="http://www.w3.org/XML/1998/namespace"/>
</xsd:schema>

rdceo 的 QTAsistant 图

于 2012-08-31T19:05:10.410 回答