내 프로젝트의 일부로 사용자 정의 스키마 문서의 많은 변환이 필요합니다. 대상 네임 스페이스를 변경하고 형식 상호 참조를 지원하며 복수 스키마 문서를 만들 때 wsdl
을 빌드 할 수 있어야합니다. 가장 일반적으로 사용되는 작업 중 하나는 스키마를 wsdl 파일로 가져 오기 전에 네임 스페이스 접두어를 변경하는 것입니다. 나는 org.xml.sax.ContentHandler
을 사용하고있다. 이름 공간을 처리하는 방법은 startPrefixMapping
이다. 요소 유형을 변경하지 않으면 모든 것이 잘 작동합니다. 여기 XML 스키마. 네임 스페이스 인식 속성 값 처리
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<complexType name="Param">
<sequence>
<element name="key" type="string"/>
<element name="value" type="string"/>
</sequence>
</complexType>
<!-- omitted -->
이다
<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema">
<types>
<xs:schema>
<xs:complexType name="Param">
<xs:sequence>
<xs:element name="key" type="xs:string"/> <!-- 'xs:' to be added -->
<xs:element name="value" type="xs:string"/> <!-- 'xs:' to be added -->
</xs:sequence>
</xs:complexType>
<!-- omitted -->
문제는 몇몇 스키마의 속성 값 (<element>
에 type
, <extension>
에 base
)이 있다는 것이다 namespace-aware이며 위의 예에서 변경 될 수 있습니다. 볼 수 있듯이 DOM이나 SAX 파서는이 상황을 처리 할 수 없으므로 현재 추한 문자열 연산을 사용하여 특정 속성 값에서 네임 스페이스 정보를 검색합니다.
내가 실종 됐어? 이러한 종류의 작업을 처리 할 수있는 API, 라이브러리 또는 기타 스키마 관련 도구가 있습니까?
이것은 성가신 일입니다 ... 접두어는 요소 나 속성과 관련하여 한정된 이름의 일부가 아니지만 문자 데이터의 일부입니다. 파서는 본질적으로 그것을 인식하지 못합니다. 나는 한 번 질문했다 [당신의 문제를 생각 나게한다] (http://stackoverflow.com/questions/5634416/jaxb-bindings-file-namespace-aware-node-selection). 스키마 네임 스페이스에 속하는 요소에서 특정 속성의 내용 (예 :'type')을 처리하는 XSLT 스타일 시트를 통해 XML을 전달할 수 있습니다. –
@G_H, 의견을 보내 주셔서 감사합니다. XSLT를 사용하는 것은 받아 들일 만 한 해결책으로 보인다. 특히 주제에 대한'jtahlborn'의 견해를 읽은 후에. – Osw