重新排列 XSD xs:sequence 使用 xslt 转换为另一个 xsd [英] Re-arranging XSD xs:sequence using xslt to convert to another xsd

查看:34
本文介绍了重新排列 XSD xs:sequence 使用 xslt 转换为另一个 xsd的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的事情:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="PRO">
      <xs:sequence>
        <xs:element ref="LIC" minOccurs="0"
            maxOccurs="unbounded">
        </xs:element>
        <xs:element ref="SPEC" minOccurs="0"
            maxOccurs="unbounded">
        </xs:element>
        <xs:element ref="NPI" minOccurs="0" maxOccurs="unbounded">
        </xs:element>
      </xs:sequence>   
    </xs:complexType>

   <xs:complexType name="LIC">
   </xs:complexType>
   <xs:complexType name="SPEC">
   </xs:complexType>
   <xs:complexType name="NPI">
   </xs:complexType>

   <xs:element name="LIC" type="LIC">
   </xs:element>
   <xs:element name="SPEC" type="SPEC">
   </xs:element>
   <xs:element name="NPI" type="NPI">
   </xs:element>
</xs:schema>

我想重新排列 xsd,如下所示:

I want to re-arrange xsd as given below:

      <xs:sequence>
         <xs:element ref="NPI" minOccurs="0" maxOccurs="unbounded">
         </xs:element>
         <xs:element ref="SPEC" minOccurs="0"
            maxOccurs="unbounded">
         </xs:element>
         <xs:element ref="LIC" minOccurs="0"
            maxOccurs="unbounded">
         </xs:element>
     </xs:sequence>

排序没有特定的规则,但需要的只是这个顺序.这只是一个示例.

There is no specific rule for sorting but just this order is what needed. This is just a sample.

提前致谢.碧菊

推荐答案

使用多个 apply-templates 来控制执行身份转换的顺序.这仅适用于需要重新排列的相对较少的 xs:element 元素.

Use multiple apply-templates to control the order in which the identity transform is performed. This makes sense only for a relatively small number of xs:element elements that need to be rearranged.

样式表

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:xs="http://www.w3.org/2001/XMLSchema">

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="xs:sequence[parent::xs:complexType/@name='PRO']">
      <xsl:copy>
         <xsl:apply-templates select="xs:element[@ref='NPI']"/>
         <xsl:apply-templates select="xs:element[@ref='SPEC']"/>
         <xsl:apply-templates select="xs:element[@ref='LIC']"/>
      </xsl:copy>
   </xsl:template>

</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="PRO">
         <xs:sequence>
         <xs:element ref="NPI" minOccurs="0" maxOccurs="unbounded">
        </xs:element>
         <xs:element ref="SPEC" minOccurs="0" maxOccurs="unbounded">
        </xs:element>
         <xs:element ref="LIC" minOccurs="0" maxOccurs="unbounded">
        </xs:element>
      </xs:sequence>   
    </xs:complexType>

   <xs:complexType name="LIC">
   </xs:complexType>
   <xs:complexType name="SPEC">
   </xs:complexType>
   <xs:complexType name="NPI">
   </xs:complexType>

   <xs:element name="LIC" type="LIC">
   </xs:element>
   <xs:element name="SPEC" type="SPEC">
   </xs:element>
   <xs:element name="NPI" type="NPI">
   </xs:element>
</xs:schema>

这篇关于重新排列 XSD xs:sequence 使用 xslt 转换为另一个 xsd的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆