2013-04-04 66 views
3

我一直在試圖寫一個xslt轉換,將'俄羅斯娃娃'風格xsd轉換成'威尼斯盲人'。俄羅斯娃娃到百葉簾xsl轉換

我已經寫了一些東西,但沒有完全按照我的意圖工作。 所以我有以下XSD文件:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="GX" targetNamespace="GX" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:complexType name="topType"> 
     <xs:sequence> 
      <xs:element name="REQUESTOR" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="RETURN_CANCELLED_CUSTOMERS" nillable="false" minOccurs="0" maxOccurs="1"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="EXTERNAL_CUSTOMER_ID" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
         <xs:element name="ON_BEHALF_OF" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/> 
         <xs:element name="MSISDN_aaa" nillable="false" minOccurs="0" maxOccurs="1"> 
          <xs:complexType> 
           <xs:sequence> 
            <xs:element name="GSP_ID" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
            <xs:element name="MSISDN_bbb" nillable="false" minOccurs="0" maxOccurs="1"> 
             <xs:complexType> 
              <xs:sequence> 
               <xs:element name="SSPP_ID" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
               <xs:element name="MSISDN_ccc" nillable="false" minOccurs="0" maxOccurs="1"> 
                <xs:complexType> 
                 <xs:sequence> 
                  <xs:element name="SSPC_ID" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
                  <xs:element name="MSISDN_ddd" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
                  <xs:element name="IMSI" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
                  <xs:element name="MSISDN" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
                 </xs:sequence> 
                </xs:complexType> 
               </xs:element> 
              </xs:sequence> 
             </xs:complexType> 
            </xs:element> 
           </xs:sequence> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

,我嘗試在轉換到:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="GX" targetNamespace="GX" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:complexType name="topType"> 
     <xs:sequence> 
      <xs:element name="REQUESTOR" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="RETURN_CANCELLED_CUSTOMERS" type="tns:RETURN_CANCELLED_CUSTOMERSType" nillable="false" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="RETURN_CANCELLED_CUSTOMERSType"> 
     <xs:sequence> 
      <xs:element name="EXTERNAL_CUSTOMER_ID" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="ON_BEHALF_OF" type="xs:string" nillable="false" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="MSISDN_aaa" type="tns:MSISDN_aaaType" nillable="false" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="MSISDN_aaaType"> 
     <xs:sequence> 
      <xs:element name="GSP_ID" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="MSISDN_bbb" type="tns:MSISDN_bbbType" nillable="false" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="MSISDN_bbbType"> 
     <xs:sequence> 
      <xs:element name="SSPP_ID" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="MSISDN_ccc" type="tns:MSISDN_cccType" nillable="false" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="MSISDN_cccType"> 
     <xs:sequence> 
      <xs:element name="SSPC_ID" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="MSISDN_ddd" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="IMSI" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
      <xs:element name="MSISDN" type="xs:string" nillable="false" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

我寫的XSLT正在進行非常多的工作,我很努力......做有人做過類似的事情,可以提供一些建議嗎?基本上我被卡住了。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:exsl="http://exslt.org/common" exclude-result-prefixes='exsl'> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="GX" targetNamespace="GX" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
      <!-- processing starts here from the root element --> 
      <xsl:apply-templates/> 
     </xs:schema> 
    </xsl:template> 
    <xsl:template match="xs:complexType[not(@name)]"> 
     <xs:complexType name="{../@name}Type"> 
      <xs:sequence> 
       <xsl:apply-templates/> 
       <xs:element>current:<xsl:value-of select="./@name"/> parent: <xsl:value-of select="../@name"/> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:element>no name = parent: <xsl:value-of select="../@name"/> 
     </xs:element> 
    </xsl:template> 
    <!--find the most nested complex type i.e. there are no more child complext types--> 
    <xsl:template match="xs:complexType[not(xs:sequence/xs:element/xs:complexType)]"> 
     <xs:complexType name="{../@name}Type"> 
      <xsl:copy-of select="child::node()"/> 
      <xs:element>current:<xsl:value-of select="./@name"/> parent: <xsl:value-of select="../@name"/>NO MORE NESTING!!!!!!!!!!!!!</xs:element> 
     </xs:complexType> 
    </xsl:template> 
    <xsl:template match="xs:element"> 
     <xsl:copy> 
      <xsl:apply-templates select="attribute()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="attribute()"> 
     <xsl:copy/> 
    </xsl:template> 
    <xsl:template match="xs:element[xs:complexType]"> 
     <xs:element name="{@name}" type="{@name}Type" nillable="{@nillable}" minOccurs="{@minOccurs}" maxOccurs="{@maxOccurs}"/> 
     <xsl:apply-templates/> 
    </xsl:template> 
</xsl:stylesheet> 

回答

4

你可以開始,在你的根模板,只需選擇在XSD你複雜類型的

<xsl:apply-templates select="//xs:complexType" /> 

你會再有一個模板匹配複雜類型,這不有一個名字,所以你可以簡單地使用基於他們父元素的名字輸出它們。

<xsl:template match="xs:complexType[not(@name)]"> 
    <xs:complexType name="{../@name}Type"> 
     <xsl:apply-templates/> 
    </xs:complexType> 
</xsl:template> 

最後,你將有一個模板來匹配帶有複雜類型的元素,並添加一個類型屬性

<xsl:template match="xs:element[xs:complexType]"> 
    <xs:element type="{@name}Type"> 
     <xsl:apply-templates select="@*" /> 
    </xs:element> 
</xsl:template> 

以下是完整的XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:exsl="http://exslt.org/common" exclude-result-prefixes='exsl'> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="GX" targetNamespace="GX" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
     <!-- processing starts here from the root element --> 
     <xsl:apply-templates select="//xs:complexType" /> 
    </xs:schema> 
    </xsl:template> 

    <xsl:template match="xs:complexType[not(@name)]"> 
    <xs:complexType name="{../@name}Type"> 
     <xsl:apply-templates/> 
    </xs:complexType> 
    </xsl:template> 

    <xsl:template match="xs:element[xs:complexType]"> 
    <xs:element type="{@name}Type"> 
     <xsl:apply-templates select="@*" /> 
    </xs:element> 
    </xsl:template> 

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

當應用於你XSD XML以下是輸出

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:tns="GX" 
      targetNamespace="GX" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified"> 
    <xs:complexType name="topType"> 
    <xs:sequence> 
     <xs:element maxOccurs="1" minOccurs="0" name="REQUESTOR" nillable="false" type="xs:string"/> 
     <xs:element type="RETURN_CANCELLED_CUSTOMERSType" maxOccurs="1" minOccurs="0" name="RETURN_CANCELLED_CUSTOMERS" nillable="false"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="RETURN_CANCELLED_CUSTOMERSType"> 
    <xs:sequence> 
     <xs:element maxOccurs="1" minOccurs="0" name="EXTERNAL_CUSTOMER_ID" nillable="false" type="xs:string"/> 
     <xs:element maxOccurs="1" minOccurs="1" name="ON_BEHALF_OF" nillable="false" type="xs:string"/> 
     <xs:element type="MSISDN_aaaType" maxOccurs="1" minOccurs="0" name="MSISDN_aaa" nillable="false"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="MSISDN_aaaType"> 
    <xs:sequence> 
     <xs:element maxOccurs="1" minOccurs="0" name="GSP_ID" nillable="false" type="xs:string"/> 
     <xs:element type="MSISDN_bbbType" maxOccurs="1" minOccurs="0" name="MSISDN_bbb" nillable="false"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="MSISDN_bbbType"> 
    <xs:sequence> 
     <xs:element maxOccurs="1" minOccurs="0" name="SSPP_ID" nillable="false" type="xs:string"/> 
     <xs:element type="MSISDN_cccType" maxOccurs="1" minOccurs="0" name="MSISDN_ccc" nillable="false"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="MSISDN_cccType"> 
    <xs:sequence> 
     <xs:element maxOccurs="1" minOccurs="0" name="SSPC_ID" nillable="false" type="xs:string"/> 
     <xs:element maxOccurs="1" minOccurs="0" name="MSISDN_ddd" nillable="false" type="xs:string"/> 
     <xs:element maxOccurs="1" minOccurs="0" name="IMSI" nillable="false" type="xs:string"/> 
     <xs:element maxOccurs="1" minOccurs="0" name="MSISDN" nillable="false" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 
+0

嗨,這作品的魅力!我幾乎有它,我甚至有身份變換,我仍然沒有得到它......現在看起來很簡單,但我真的不明白這是如何工作的...... – akolodk 2013-04-04 13:16:20

+0

這是XSLT的力量/一開始可能會讓人傷腦筋,但要堅持下去,很快事情就會變得清晰,你會欣賞它的美麗。 – 2013-04-04 13:52:36