如何转换基础 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>
根据要求。
这更多是关于技术或工具的使用问题,而不是操作方法。
我有一个 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>
根据要求。