[英]XSD Validation error on xml:lang
我嘗試驗證這一點(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
你能告訴我為什么嗎 ? 非常感謝 !
元素langstring
的定義如下:
<xs:anyAttribute namespace="##other" processContents="strict"/>
這意味着當且僅當架構中存在該屬性的屬性聲明時,它才允許來自另一個命名空間的屬性。 由於它們不導入XML命名空間的模式,因此除非您采取措施包含它,否則模式中不會聲明xml:lang。 我不熟悉你正在使用的PHP接口,所以我不能告訴你實現它的最佳方法,但一種方法是定義一個模式文檔D,它導入imsglobal模式和XML名稱空間的模式,並使用D作為驗證實例的模式。
另一種方式是引用的示例的方式:它們從實例文檔中的xsi:schemaLocation屬性引用XML命名空間。
這里的關鍵是在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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.