我尝试验证这一点(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
你能告诉我为什么吗? 非常感谢!答案 0 :(得分:3)
元素langstring
的定义如下:
<xs:anyAttribute namespace="##other" processContents="strict"/>
这意味着当且仅当架构中存在该属性的属性声明时,它才允许来自另一个命名空间的属性。由于它们不导入XML命名空间的模式,因此除非您采取措施包含它,否则模式中不会声明xml:lang。我不熟悉你正在使用的PHP接口,所以我不能告诉你实现它的最佳方法,但一种方法是定义一个模式文档D,它导入imsglobal模式和XML名称空间的模式,并使用D作为验证实例的模式。
另一种方式是引用的示例的方式:它们从实例文档中的xsi:schemaLocation属性引用XML命名空间。
答案 1 :(得分:1)
这里的关键是在 langstring 元素上使用xs:anyAttribute,它是严格的处理子句,以及如何xml:lang
工作。
strict 表示 XML处理器必须获取所需命名空间的架构,并验证这些命名空间中的任何属性。
事情,任何体面的XML Schema处理器都应该内置支持我称之为基本模式的东西;描述xml:lang的xml.xsd只是其中之一。
就我而言,使用QTAssistant,您的XML验证就好了。
我可以告诉你,如果他们(模式作者)将xsd:import包含到http://www.w3.org/XML/1998/namespace,即使没有模式位置,它也会帮助其他处理器,甚至可以明确地引用它们xml:属于i18n的内容的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>