重新排列 XSD xs:sequence 使用 xslt 转换为另一个 xsd [英] Re-arranging XSD xs:sequence using xslt to convert to another xsd
本文介绍了重新排列 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屋!
查看全文