使用xslt通过给定的xsd按顺序放置xml元素

时间:2016-02-12 11:01:30

标签: xslt xsd

我构建了一个简单的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重新排序或检测顺序?

1 个答案:

答案 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>

请注意,此解决方案仅限于此相当简单的情况。