2011-04-19 65 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的一個片段:

<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"/> 

什麼我不知道如何解決的是:如何利用目標XSD從源XML轉換節點到目標XML文檔。我覺得所有執行轉換的信息都位於XSD中,但我可以使用它嗎?怎麼樣?

任何幫助將不勝感激!

+4

目標XSD將幫助您驗證轉換的結果,但不會直接幫助生成轉換。然而,像開發樣式表*一樣,一個好的XSLT IDE,如Oxygen和可能的StylusStudio,將幫助您在很大程度上驗證輸出元素。考慮到結果文檔的模式,架構感知型XSLT 2.0處理器還可以在運行時驗證其輸出。 – LarsH 2011-04-19 20:10:08

+0

@LarsH XSLT IDE可以更進一步,使用XSD爲XSLT允許的literal-result-elements/attributes提供自動完成。與此相關的主要問題是,除非所有元素和屬性都在XSD的頂層(全局)中聲明,否則如果上下文不足,可能會出現模糊。另外,這在使用xsl:element和xsl:attribute指令而不是文字結果等價物時沒有幫助,但我認爲它比沒有好。 – pgfearo 2011-04-20 03:35:42

+0

@pgfearo - 我認爲IDE會提供輔助完成功能,但我沒有太多使用XSD,所以我不確定。正如你所說,它仍然不是一個完整的解決方案,但可能會有所幫助。 – LarsH 2011-04-20 16:47:04

回答

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。 – 2011-04-20 21:07:20

+0

謝謝。我做了改變。 – 2011-04-20 23:44:33

+0

但是這並不回答你的問題,因爲你沒有要求XSLT樣式表... – 2011-04-21 02:12:24