我构建了一个简单的xml文档,例如
<Address>
<Recipient>
abc
</Recipient>
<Street>
123
</Street>
</Address>
对于这个xml,存在一个xsd例如。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Address">
<xs:complexType>
<xs:sequence>
<xs:element name="Street"/>
<xs:element name="Recipient"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
你可以看到Street和Recipient的顺序是错误的。如何在xml的构建过程中对xsd重新排序或检测顺序?
答案 0 :(得分:0)
你可以这样做:
<?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 encoding="UTF-8" indent="yes" method="xml"/>
<xsl:variable name="schema">
<xsl:copy-of select="doc('test.xsd')"/>
</xsl:variable>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Address">
<xsl:copy>
<xsl:variable name="Address" select="."/>
<xsl:for-each select="$schema//xs:element[@name='Address']/xs:complexType/xs:sequence/xs:element/@name">
<xsl:apply-templates select="$Address/*[local-name()=current()]"/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请注意,此解决方案仅限于此相当简单的情况。