这更多是使用技术或工具的问题,而不是使用方法。
我有一个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来查找和删除/修改标签和属性吗?
答案 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>
按要求。