2011-06-14 99 views
1

誰能給我像轉化使用XSL轉換XML架構模板應用到其他的XML架構模板

<xs:element name="carareWrap"> 
    <xs:annotation> 
     <xs:documentation xml:lang="en">The CARARE wrapper element. It wraps CARARE elements.</xs:documentation> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element minOccurs="1" maxOccurs="unbounded" ref="carare"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

XML架構模板,使用XSL的其他XML架構模板的範例? 其他XML模式可以是任何東西,你可以做..我只是需要有somwthing下手......

回答

1

誰能給我轉換XML架構模板等等的範例......到其他XML模式模板?

XML Schema只是一個聲明名稱空間爲uri http://www.w3.org/2001/XMLSchema的XML文檔。因此,您可以照常應用XSLT。

例如,你有一個源架構是這樣的:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="carareWrap"> 
    <xs:annotation> 
     <xs:documentation xml:lang="en">The CARARE wrapper element. It wraps CARARE elements.</xs:documentation> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element minOccurs="1" maxOccurs="unbounded" ref="carare"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

和(例如)要刪除僅供參考元素的屬性。您可以採用以下變換:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    version="1.0"> 

    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="xs:element[@ref]"> 
     <xsl:copy> 
      <xsl:copy-of select="@ref"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

結果將是:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="carareWrap"> 
     <xs:annotation> 
      <xs:documentation xml:lang="en">The CARARE wrapper element. It wraps CARARE elements.</xs:documentation> 
     </xs:annotation> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="carare" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

注意

  • 將需要輸入文檔的命名空間的聲明在XSLT中
  • 使用身份轉換按原樣複製輸入文檔並按要求覆蓋元素。
+0

+1我想我可以去,現在刪除我的答案。 ;) – Tomalak 2011-06-14 11:26:11

0

拖放XSD文檔沒有什麼特別之處。他們只是XML。

既然你沒有指定你想什麼的變化,這裏是一個示例XSLT樣式表改變隨機細節(的minOccurs在這種情況下的值)

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <!-- the identity template copyies everything as-is --> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- ...unless there is a more specific template available --> 
    <xsl:template match=" 
    xs:element[@name = 'carareWrap']//xs:element[@ref = 'carare' and @minOccurs = 1]/@minOccurs 
    "> 
    <xsl:attribute name="{name()}">2</xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="carareWrap"> 
    <xs:annotation> 
     <xs:documentation xml:lang="en">The CARARE wrapper element. It wraps CARARE elements.</xs:documentation> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element minOccurs="2" maxOccurs="unbounded" ref="carare"></xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

有幾件事情需要注意:

  • 空間聲明​​所以xs前綴是在XSLT樣式表可用
  • 使用身份模板的複製沒有被處理,否則
  • 使用複雜的比賽表現的一切選擇一個特定的節點
  • 的使用屬性值模板name()功能複製的屬性名稱:name="{name()}"