2017-09-01 8 views
2

名前空間xmlnsは "parent"で定義され、 "child"では上書きされます。私のxsiは "parent"と "child"で同じなので、 "child"のxsi名前空間をオーバーライドする必要がありますか?overrideed名前空間に属する名前空間はどうなりますか?

<parent xmlns="namespace_A" xmlns:xsi="namespace_C" xsi:schemaLocation="namespace_D"> 
     <child xmlns="namespace_B" xsi:schemaLocation="namespace_E"> 
     </child> 
</parent> 

すべてのオンラインのバリデータは、私は受け入れられますが、XSIが「子」に拘束されていないと言うXMLを処理するとき、私はエラーを取得するなど、XMLを検証してみました。

私はこの問題を持っている特定のコードは次のとおり

<?xml version="1.0" encoding="UTF-8"?> 
<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"> 
    <responseDate>2017-08-24T12:54:26</responseDate> 
    <request verb="ListRecords" from="2017-08-08" set="J:10.1007:53599" metadataPrefix="CR_UNIXML" resumptionToken="91554975-0bb1-4cf5-86ae-b2222e6fe01f">http://oai.crossref.org/OAIHandler</request> 
    <!-- recipient 96 crlabs2 --> 
    <ListRecords> 
     <record> 
     <header> 
      <!-- citation-id: 92292627; type: JOURNAL_ARTICLE; --> 
      <identifier>info:doi/10.1007/s40278-017-34281-1</identifier> 
      <datestamp>2017-08-11</datestamp> 
      <setSpec>J</setSpec> 
      <setSpec>J:10.1007</setSpec> 
      <setSpec>J:10.1007:53599</setSpec> 
     </header> 
     <!-- [email protected] --> 
     <metadata> 
      <crossref xmlns="http://www.crossref.org/xschema/1.1" xsi:schemaLocation="http://www.crossref.org/xschema/1.1 http://www.crossref.org/schema/unixref1.1.xsd"> 

これは、外部サービスによる応答として指定されたXMLです。私は必要なデータを取得するために、XSLTファイルを受け入れ、同じ外部サービスによって与えられたプロセッサとデータの一部を処理したいが、私は次のエラーを取得する:

ERROR: 'The prefix "xsi" for attribute "xsi:schemaLocation" associated with an element type "crossref" is not bound.' 
ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The prefix "xsi" for attribute "xsi:schemaLocation" associated with an element type "crossref" is not bound.' 

エラーがクラスXMLNSDocumentScannerImplで発生し、方法scanStartElement()。次のループでは、uriはnullになり、エラーがスローされます。

// bind attributes (xmlns are already bound bellow) 
      int length = fAttributes.getLength(); 
      // fLength = 0; //initialize structure 
      for (int i = 0; i < length; i++) { 
       fAttributes.getName(i, fAttributeQName); 

       String aprefix = fAttributeQName.prefix != null 
         ? fAttributeQName.prefix : XMLSymbols.EMPTY_STRING; 
       String uri = fNamespaceContext.getURI(aprefix); 
       // REVISIT: try removing the first "if" and see if it is faster. 
       // 
       if (fAttributeQName.uri != null && fAttributeQName.uri == uri) { 
        // checkDuplicates(fAttributeQName, fAttributes); 
        continue; 
       } 
       if (aprefix != XMLSymbols.EMPTY_STRING) { 
        fAttributeQName.uri = uri; 
        if (uri == null) { 
         fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, 
           "AttributePrefixUnbound", 
           new Object[]{fElementQName.rawname,fAttributeQName.rawname,aprefix}, 
           XMLErrorReporter.SEVERITY_FATAL_ERROR); 
        } 
        fAttributes.setURI(i, uri); 
        // checkDuplicates(fAttributeQName, fAttributes); 
       } 
      } 
+0

ファイルが本当にそのように始まっていれば(結局のところどのように終了するのかわからない)、このエラーはプロセッサ側で問題になります。しかし、私はXercesをこのバグで失敗させることはできません。このエラーを引き起こすJavaコードを表示できますか? – kumesana

+0

Xercesのエラーをトリガするコードで質問を再度更新しました。 – nrad0

答えて

3

オーバーライドされた名前空間には何も起こりません。彼らはもはや、対応する接頭辞によって、またはデフォルトとして設計された名前空間ではありません。それだけです。

同じxmlns:接頭辞に同じ名前空間URIを "上書き"することには何の効果もありません。 xmlns:xsiは必ず同じである必要があるので、ルート要素以外の場所で定義する必要はありません。

また、xsi:schemaLocationをルート要素以外の場所で定義する必要はありません。最初のxsi:schemaLocation内のすべてのネームスペースのすべてのスキーマの完全なリストを直接与えることができます。これにより、別のスキーマを持つことができます。

All the online validators I tried verify the xml as accepted but I get an error when processing the xml, which says xsi is not bound in "child".

上記の例では、xsiが実際にバインドされています。そうではないと主張するプロセッサは間違っています。バグで、結果が間違っています。

実際のドキュメントは、例を示したとおり正確ではありません。

ascend要素でバインドされた接頭辞は、子孫要素でアンバインドされることはありませんが、可能性もあります。したがって、必要な例があります。

+0

私の質問を引き起こした特定の問題で私の質問を更新しました。 – nrad0

+0

また、ご協力いただきありがとうございます。 – nrad0