如何为不同的用途转换基本XML Schema?

时间:2016-04-12 02:27:03

标签: xml xpath xsd

这更多是使用技术或工具的问题,而不是使用方法。

我有一个XML Schema,开发团队使用它来解析输入和输出以及自动代码生成。

架构是为开发人员设计的。但是,此架构还有其他用途,它们具有不同的需求。例如,开发人员模式是强类型的,但是需要对用户模式进行弱类型以允许更换通配符。另一个例子是开发人员工具使用的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来查找和删除/修改标签和属性吗?

1 个答案:

答案 0 :(得分: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>

输入您的输入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: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,

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

按要求。

相关问题