簡體   English   中英

xml:lang上的XSD驗證錯誤

[英]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>

rdceo的QTAssistant圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM