2016-04-12 29 views
1

Bu, nasıl yapılır?Temel XML şeması, farklı kullanımlar için nasıl dönüştürülür?

Geliştirme ekibi tarafından girdi ve çıktı ve otomatik kod oluşturma ayrıştırma için kullanılan bir XML Şeması var.

Şema geliştiriciler için tasarlanmıştır. Ancak bu şema için farklı ihtiyaçlara sahip başka kullanımlar da vardır. Örneğin, geliştirici şema güçlü bir şekilde yazılmıştır, ancak joker ikameye izin vermek için kullanıcı şemasının zayıf bir şekilde yazılması gerekecektir. Başka bir örnek, geliştirici araçları tarafından kullanılan appinfo ek açıklamalarıdır. Bunlar, kullanıcı şemasından çıkarılacaktı.

Örneğin

bu: burada yararlı olabilir

<xs:complexType name="ModelA"> 
    <xs:annotation id="ModelA" > 
    <xs:documentation> 
    <description>A model. Used by A in Camelot.</description> 
    </xs:documentation> 
    </xs:annotation> 
    <xs:complexContent> 
    <xs:extension base="dbs:Models"> 
    <xs:sequence> 
     <xs:element name="RoundTables" type="xs:string"/> 
     <xs:element name="ClarkGable" type="xs:string"/> 
     <xs:element name="SequinVests" type="xs:string"/> 
     <xs:element name="Opera" type="xs:string"/> 
    </xs:sequence> 
    </xs:extension> 
</xs:complexContent> 

misiniz XSLT:

<xs:complexType name="ModelA"> 
<xs:annotation id="ModelA" > 
    <xs:appinfo> 
    <dev_type>AObject</dev_type> 
    <function id="AFunction"> 
     <parameters> 
     <parameter>P1</parameter> 
     <parameter>P2</parameter> 
     </parameters> 
    </function> 
    </xs:appinfo> 
    <xs:documentation> 
    <description>A model. Used by A in Camelot.</description> 
    </xs:documentation> 
</xs:annotation> 
<xs:complexContent> 
    <xs:extension base="dbs:Models"> 
    <xs:sequence> 
     <xs:element name="RoundTables" type="xs:decimal"/> 
     <xs:element name="ClarkGable" type="xs:boolean"/> 
     <xs:element name="SequinVests" type="xs:decimal"/> 
     <xs:element name="Opera" type="xs:string"/> 
    </xs:sequence> 
    </xs:extension> 
</xs:complexContent> 

bu hale misiniz

? Veya şemayı XML olarak yükleyebilir ve etiketler ve öznitelikler bulmak ve silmek/değiştirmek için XPath'i kullanabilir miyim?

cevap

2

Evet, XSLT bir tabandan türetilmiş bir XSD'ye dönüştürmek için idealdir.

Örneğin

, kimlik dönüşüm içeren bu basit XSLT,

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" 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:appinfo"/> 

    <xsl:template match="@type"> 
    <xsl:attribute name="type">xs:string</xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

girişinizi XSD alır

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="ModelA"> 
    <xs:annotation id="ModelA" > 
     <xs:appinfo> 
     <dev_type>AObject</dev_type> 
     <function id="AFunction"> 
      <parameters> 
      <parameter>P1</parameter> 
      <parameter>P2</parameter> 
      </parameters> 
     </function> 
     </xs:appinfo> 
     <xs:documentation> 
     <description>A model. Used by A in Camelot.</description> 
     </xs:documentation> 
    </xs:annotation> 
    <xs:complexContent> 
     <xs:extension base="dbs:Models"> 
     <xs:sequence> 
      <xs:element name="RoundTables" type="xs:decimal"/> 
      <xs:element name="ClarkGable" type="xs:boolean"/> 
      <xs:element name="SequinVests" type="xs:decimal"/> 
      <xs:element name="Opera" type="xs:string"/> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

ve çıkış XSD onu dönüştüren,

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="ModelA"> 
     <xs:annotation id="ModelA"> 
     <xs:documentation> 
      <description>A model. Used by A in Camelot.</description> 
     </xs:documentation> 
     </xs:annotation> 
     <xs:complexContent> 
     <xs:extension base="dbs:Models"> 
      <xs:sequence> 
       <xs:element name="RoundTables" type="xs:string"/> 
       <xs:element name="ClarkGable" type="xs:string"/> 
       <xs:element name="SequinVests" type="xs:string"/> 
       <xs:element name="Opera" type="xs:string"/> 
      </xs:sequence> 
     </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

istendiği gibi.

+1

Parlak. Teşekkür ederim. –

İlgili konular