2016-04-12 4 views
1

これは、ハウツーよりもむしろ使用するテクニックやツールの問題です。さまざまな用途のベースXMLスキーマを変換する方法は?

私は、開発チームが入出力の解析と自動コード生成に使用するXMLスキーマを持っています。

スキーマは開発者向けに設計されています。しかし、このスキーマにはさまざまなニーズを持つ用途があります。たとえば、開発者のスキーマは強く型付けされますが、ワイルドカードの置換を可能にするために、ユーザースキーマを弱く型付けする必要があります。もう1つの例は、開発者ツールで使用されるappinfo注釈です。これらはユーザースキーマから削除されます。

たとえば、この:

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

は、XSLT、ここで有用であろうか?あるいは、スキーマをXMLとしてロードし、XPathを使用してタグと属性を見つけて削除/変更できますか?

答えて

2

はい、XSLTはベースから派生したXSDに変換するのに適しています。例えば

、恒等変換に基づいて、このシンプルな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> 

<?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> 

、あなたの入力XSDを取り、あなたの出力XSDにそれを変換し、

<?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> 

をリクエストしてください。

+1

ブリリアント。ありがとうございました。 –

関連する問題