2014-10-20 2 views
0

우리는 XSD 스키마 (특히 UBL 2.1 스키마)에 대한 설명서를 만들기 위해 XQuery 도구를 구축하고 있습니다.XQuery를 사용하여 XSD 스키마 단순화

이렇게하기 위해서는 요소 참조와 복잡한 유형을 광범위하게 사용하여 작성된 스키마를 인라인 정의로 단순화해야합니다.

따라서이 같은 요소 :

<xsd:element name="Order"> 
     <xsd:complexType> 
     <xsd:sequence> 
      ... 
      <xsd:element ref="cbc:UBLVersionID" minOccurs="0" maxOccurs="1"> 
       <xsd:complexType name="UBLVersionIDType"> 
       <xsd:simpleContent> 
        <xsd:extension base="xsd:string"/> 
       </xsd:simpleContent> 
      </xsd:complexType> 
      ... 
     </xsd:sequence> 
     </xsd:complexType> </xsd:element> 

몇 가지 요소와 유형을 가져 스키마에 정의되어 있는지 계좌에서 촬영 :

<xsd:element name="Order" type="OrderType"/> 
    <xsd:complexType name="OrderType"> 
     <xsd:sequence> 
     ... 
     <xsd:element ref="cbc:UBLVersionID" minOccurs="0" maxOccurs="1"/> 
     ... 
     </xsd:sequence> 
    </xsd:complexType> 
    ... 
    (in another file) 
    <xsd:element name="UBLVersionID" type="UBLVersionIDType"/> 
    <xsd:complexType name="UBLVersionIDType"> 
     <xsd:simpleContent> 
     <xsd:extension base="xsd:string"/> 
     </xsd:simpleContent> 
    </xsd:complexType> 

이 변환되어야합니다.

XQuery를 사용하여이를 얻을 수있는 알려진 방법이 있습니까?

감사합니다.

+0

표시되는 대상 양식이 올바른 XSD 스키마 문서가 아님 출력물의 유일한 소비자가 문서 소프트웨어 인 경우 문제가되지 않습니다. 그러나 인라인 된 ('단순화 된'형식이 아닌) 형식을 사용하여 유효성을 검사하려는 경우 (원본과 동일한 문서를 수락하고 거부하는지 테스트하는 경우) 'ref'특성을 ' 이름 '속성. (그렇지만 가져 오기 기능이 있다면 어떤 경우에도 단일 스키마 문서 (xsd : schema 요소)에 스키마를 정의 할 수 없으므로 문제가되지 않을 수도 있습니다. –

+0

맞습니다. 필자의 관심은 스키마 파일 집합 (이 경우 UBL)을 완전히 인라인 된 단일 파일로 변환하는 것입니다. –

답변

1

스키마를 Saxon의 SCM 형식으로 처리하는 것이 유용 할 수 있습니다. SCM 형식은 본질적으로 정규화 된 형식의 XSD 스키마 구성 요소를 XML로 표현한 것입니다.

java com.saxonica.Validate -xsd:schema.xsd -scmout:schema.scm 

SCM 형식에 대한 설명서는 기본적으로 W3C 사양의 스키마 구성 요소 문서입니다.

형식은 사용자가 요구하는 것과 반대입니다. 모든 구성 요소는 "라인 외부"이며, 다음 참조에서 액세스합니다. 그러나 매우 균일하며 포함, 가져 오기, 네임 스페이스 및 QName을 관리하는 모든 복잡성을 피할 수 있습니다.

+1

Saxon-HE에서 볼 기회가 있습니까? (단지 내 piggybank가 Saxon 전체를 구입할만큼 충분한 돈을 모을 때까지) –

+0

Saxon-HE에는 스키마 처리 기능이 포함되어 있지 않습니다. 미안해. 네가 감당할 수 없다면. 우리는 가격을 저렴하게 만들고 상업 및 오픈 소스 제품의 개발을위한 자금을 조달하기에 충분한 수익을 창출하지만 기능을 원하지만 비용을 정당화 할 수없는 사람들이 항상있을 것입니다. –

0

"알려진 방법"에 대해 알지 못합니다.이 말은 사용자가 상자 밖으로 나오거나 미리 만들어진 것을 의미한다고 가정합니다.

XQuery 또는 XSLT에서 수행 할 수있는 사용자 지정 변환을 효과적으로 작성해야합니다. XQuery에서 이것은 기본적으로 재귀 적으로 발생하며 여기에서 예제를 찾을 수 있습니다. https://en.wikibooks.org/wiki/XQuery/Transformation_idioms

@ michael-kay가 지적한 것처럼 가져 오기 및 포함을 처리하는 코드도 작성해야합니다. 따라서 SCM 형식을 먼저 처리 (인라인 작업을 수행하기 전에)하는 것이 좋습니다. 물론 SCM에서 스키마로 돌아갈 변환을 작성해야합니다.

+0

이것은 내가 사용해온 접근 방식이지만 무한 재귀에 문제가 있습니다. 제안 할 좋은 XQuery 디버거가 있습니까? –

+0

Saxon을 사용하고 있다면, Oxygen IDE에 내장 된 꽤 괜찮은 디버거가 있습니다. – adamretter

+0

프로젝트의 https://github.com/lcahlander/xsd2json.git에서 xsd2json.xqy의 parse-level() 함수를 살펴보십시오. 그것은 무한 재귀 문제를 처리합니다. –