如何转换基础 XML 模式以供不同用途?

How to transform a base XML Schema for different uses?

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

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

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

是的,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>

根据要求。