【问题标题】:XSD with version control on attribute with skip behavior带有跳过行为的属性版本控制的 XSD
【发布时间】:2012-01-31 04:00:02
【问题描述】:

我希望能够对我的 XML 文件进行版本控制。我想要一个较旧的 xsd 文件能够验证收到的 XML 文件的较新版本。

为此,我将使用版本属性保护未知的 xml 标记。

问题:如何让 xsd 根据版本属性跳过部分 XML?在下面的示例中,我希望 xsd 能够验证版本 1 和 2 但不是 3 的任何标签。

场景:

    <MYXML>
    <SOME_XML version="1">
        <SOME_VERSION_1_DATA>this_is_data_only_for_version_1</SOME_VERSION_1_DATA>
    </SOME_XML>
    <SOME_XML version="2">
        <SOME_VERSION_2_DATA>this_is_data_only_for_version_2</SOME_VERSION_2_DATA>
    </SOME_XML>
    <SOME_XML version="3">
        <SOME_VERSION_3_DATA>this_is_data_only_for_version_3</SOME_VERSION_3_DATA>
    </SOME_XML>
</MYXML>


<xs:complexType name="SOME_XML">
    <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="1" name="SOME_VERSION_1_DATA" type="xs:string"/>
        <xs:element minOccurs="0" maxOccurs="1" name="SOME_VERSION_2_DATA" type="xs:string"/>
   </xs:sequence>
   <xs:attribute ref="version"/>
 </xs:complexType>

 <xs:attribute name="version">
   <xs:simpleType>
    <xs:restriction base="xs:integer">
       <xs:enumeration value="1"/>
       <xs:enumeration value="2"/>
     </xs:restriction>
     <xs:anyAttribute processContents="skip"/>  <-- SKIP the attribute if NOT 1 ro 2?
   </xs:simpleType>
</xs:attribute>

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    我不确定如何直接回答您的问题,即使用从 XML 中跳过特定细节。
    如果在您的环境中可行,我建议 xslt 转换原始 XML,其中版本 3 文件将被跳过,并验证 XLST 生成的输出。

    XSLT 复制整个文件,同时丢弃具有 @atribute 版本 == 3 的节点

    <xsl:template match="*">
        <xsl:if test="@version != '3'">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>
    <xsl:template match="@*|text()|comment()|processing-instruction()">
        <xsl:copy-of select="."/>
    </xsl:template>
    

    注意,XSLT 按原样编写,未针对给定输入进行测试。

    【讨论】:

      【解决方案2】:

      我不会为此使用属性,因为属性不能“改变”内容模型。如果您考虑让您的应用程序以“向前兼容”的方式处理 XML(即,将旧 XSD 用于新内容),那么我宁愿使用强制版本元素,然后是可选的 xsd:any - 全部与一些混合设计规则。

      长话短说,您将需要这种设置来处理唯一的粒子属性约束(或者换句话说,解析器无法提前确定其“位置”的约束) XSD)。

      最初,您甚至可以在没有强制性版本标签的情况下开始,只需在您的可扩展性“位置”所在的位置粘贴一个可选的 xsd:any 即可。随着后续版本细化内容,您可能必须添加此强制性版本标记(再次处理 UPA),然后是细化内容,然后是可选的 xsd:any。

      一般来说,还有其他需要考虑的事情,例如在 XSD 中使用类型扩展/限制以及它可能对前向兼容性方案(例如我刚才描述的方案)产生的影响(请阅读 @987654321 @)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-19
        • 1970-01-01
        • 2011-07-24
        • 2010-10-19
        • 1970-01-01
        • 2021-05-27
        • 2013-03-25
        相关资源
        最近更新 更多