Saxon을 사용하여 여러 스키마 파일에 대해 여러 XML 파일의 유효성을 검사 할 때 문제가 발생합니다. 여러 요소 사이에 존재하는 substitutionGroup 관계로 인해 문제가 발생합니다. 다음은 문제의 간단한 재구성입니다.첫 번째 파일의 유효성을 검사 한 후 substitutionGroup 멤버가 스키마에 추가 된 경우 Saxon으로 여러 xml 파일의 유효성을 검사 할 수 없습니다.
스키마는 다음과 같습니다
family.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://myexample/family" xmlns:fam="http://myexample/family" xmlns="http://www.w3.org/2001/XMLSchema">
<element name="FamilyMember" type="string" />
<element name="Parent" type="string" substitutionGroup="fam:FamilyMember"/>
<element name="Child" type="string" substitutionGroup="fam:FamilyMember"/>
<element name="Family">
<complexType>
<sequence>
<element ref="fam:FamilyMember" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
</schema>
family_ext.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://myexample/family_ext" xmlns:fam="http://myexample/family" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://myexample/family" schemaLocation="http://www.valid.nl/taxo3/family.xsd"/>
<element name="Cousin" type="string" substitutionGroup="fam:FamilyMember"/>
</schema>
두 개의 인스턴스 문서는 다음과 같습니다
family1.xml
여기<Family xmlns="http://myexample/family" xmlns:fam2="http://myexample/family_ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://myexample/family_ext http://www.valid.nl/taxo3/family_ext.xsd" >
<Parent>John</Parent>
<Child>Alice</Child>
<fam2:Cousin>Pete</fam2:Cousin>
</Family>
438,953,210
family2.xml 문제이다 I 먼저 addSchemaSource 방법을 사용 색슨 구성에 family.xsd로드. 그런 다음 family1.xml의 유효성을 검사합니다. 이 작동합니다. 내가 처음 family2.xml을 확인하는 경우
In content of element <Family>: The content model does not allow element <Q{.../family_ext}Cousin> to appear immediately after element <{http://myexample/family}Child>. Expected <Q{.../family}FamilyMember> or nothing.
그러나, 검증이 성공 (그리고 그때 family1.xml의 유효성을 검사하는 경우에도 성공) : 다음 family2.xml을 확인하려고하면, 나는 다음과 같은 오류가 발생합니다.
이 문제의 해결 방법은 유효성 검사간에 스키마 캐시를 지우는 것입니다. 그러나 이것은 실제 사용 사례에서 수십 개의 스키마가있는 캐시를 가지고 있기 때문에 계속로드하지 않아도되므로 궁극적으로 매우 만족스러운 솔루션은 아닙니다. 게다가 밸리데이션을 시작할 때, shemas의 총 컬렉션이 무엇인지는 아직 알지 못하기 때문에 선입 선행으로 모든 것을로드 할 수는 없습니다 (위 예제의 컨텍스트에서 family.xsd와 family_ext.xsd를로드 할 수 없습니다. 유효성 검사가 시작될 때).
유효성 검사를 수행하는 순서가 중요한 이유는 무엇입니까? 그리고 Saxon이 스키마 캐시를 지우지 않고 이러한 종류의 유효성 검사를 처리하도록하는 방법이 있습니까?
참고, 문제는 여기에 기록됩니다 https://saxonica.plan.io/issues/2174 –
우리는 색슨의이 동작은 실제로 설명되어 있다는 것을 발견 [.NET api] (http://www.saxonica.com/documentation9.4-demo/dotnetdoc/Saxon/Api/SchemaManager.html)의 SchemaManager 클래스 (부끄러움이 자바 문서에도 존재하지 않는다!). 내가 예외적으로 예상 한 예외를 얻지 못하는 이유는 구성에 family_ext 스키마를 명시 적으로로드하지 않았기 때문이며 대신 Saxon이 schemaLocation 힌트를 통해 스키마를 발견하도록했기 때문입니다. 명시 적으로 스키마를로드하면 실제로 예외가 발생합니다. –
확인. 스키마 위치 힌트에 의존하면 필요한 네임 스페이스 스키마가 이미 사용 가능하다는 이유로 무시됩니다. 나는 MULTIPLE_SCHEMA_IMPORTS 옵션이 어쨌든로드되도록 강요 하겠지만 인상을받지 못했습니다. –