2011-04-19 1 views
0

스키마를 사용하지 않는 XML 문서를 잘 정의 된 스키마를 사용하는 다른 형식으로 변환해야합니다.XML을 이전 스키마에서 새 스키마로 변환 하시겠습니까?

그래서 기본적으로 나는이 변환해야이 속으로

<healthCareFacilityTypeCode 
    displayName="Home" 
    codingScheme="Connect-a-thon healthcareFacilityTypeCodes" 
    >Home</healthCareFacilityTypeCode> 

:

<healthCareFacilityTypeCode> 
    <code>Home</code> 
    <displayName> 
     <LocalizedString value="Home" /> 
    </displayName> 
    <schemeName>Connect-a-thon healthcareFacilityTypeCodes</schemeName> 
</healthCareFacilityTypeCode> 

내가 스키마를보고 손으로 변환하는 방법을 알고있다. 내가 해결하는 방법을 모르는 무엇

<xsd:complexType name="DocumentEntryType"> 
    <xsd:sequence> 
     <xsd:element minOccurs="0" 
        name="healthCareFacilityTypeCode" 
        type="tns:CodedMetadataType"/> 
    </xsd:sequence> 
    <xsd:attribute default="false" 
        name="existing" 
        type="xsd:boolean" 
        use="optional"/> 
</xsd:complexType> 
<xsd:element name="DocumentEntry" type="tns:DocumentEntryType"/> 

은 다음과 같습니다 : 어떻게 대상의 XML 문서에 원본 XML에서 노드를 변환 할 대상 XSD를 이용하려면 여기를 XSD의 조각이다. 변환을 수행하는 모든 정보가 XSD에 있다고 느끼지만 사용할 수 있습니까? 방법?

도움이 될 것입니다.

+4

대상 XSD는 변환 결과의 유효성을 검사하는 데 도움이되지만 직접 변환을 생성하는 데는 도움이되지 않습니다. 그러나 Oxygen 및 아마도 StylusStudio와 같은 우수한 XSLT IDE는 스타일 시트를 개발할 때 출력 요소의 유효성을 크게 높일 수 있습니다 *. 또한 스키마 인식 XSLT 2.0 프로세서는 결과 문서의 스키마가 주어지면 런타임시 해당 출력의 유효성을 검사 할 수 있습니다. – LarsH

+0

@LarsH XSLT IDE는 한 단계 더 나아가 XSLT에서 허용되는 리터럴 결과 요소/특성에 대한 자동 완성을 제공하기 위해 XSD를 사용할 수 있습니다. 가장 큰 문제점은 모든 요소와 속성이 XSD의 최상위 레벨 (전역 적)에서 선언되지 않는 한 상황이 불충분 할 경우 모호한 가능성이 있다는 것입니다. 또한 xsl : element 및 xsl : attribute 명령이 리터럴 결과 동등 물 대신 사용되는 경우에는 도움이되지 않지만 그보다 나은 점은 없을 것입니다. – pgfearo

+0

@pgfearo - IDE가 설명대로 지원을 제공한다고 생각하지만 XSD를 많이 사용하지 않아 확실하지 않습니다. 당신이 말하는 것처럼 그것은 여전히 ​​완벽한 해결책은 아니지만 도움이 될 수 있습니다. – LarsH

답변

1

다음 제안 사항은 이것이 내가 생각해 낸 것입니다. 완벽하지는 않지만 내 목적으로는 충분합니다.

<xsl:template match="XDSDocumentEntry"> 
     <DocumentEntryType> 
      <xsl:call-template name="namespaceChange"/> 
      <xsl:apply-templates/> 
     </DocumentEntryType> 
    </xsl:template> 
    <xsl:template match="node() | @*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="//*[matches(name(), 'Code')]"> 
     <xsl:copy> 
      <code> 
       <xsl:value-of select="."/> 
      </code> 
      <schemeName> 
       <xsl:value-of select="@codingScheme"/> 
      </schemeName> 
      <displayName> 
       <LocalizedString> 
        <xsl:attribute name="value"> 
         <xsl:value-of select="@displayName"/> 
        </xsl:attribute> 
       </LocalizedString> 
      </displayName> 
     </xsl:copy> 
    </xsl:template> 
+3

xsl을 사용하여 네임 스페이스 선언을 생성 할 수 없습니다. attribute - 네임 스페이스 및 속성은 XSLT 데이터 모델에서 동일한 것은 아닙니다. 규격을 따르는 XSLT 프로세서가이를 버립니다. XSLT 2.0에서는 xsl : namespace를 사용하십시오. –

+0

고맙습니다. 나는 변화를 만들었다. –

+0

하지만 XSLT 스타일 시트를 요구하지 않았기 때문에이 질문에 대답하지 않습니다 ... –