XSLT:特定元素总是添加到root?

时间:2009-07-09 20:22:32

标签: xslt

我遇到一种情况,特殊元素(xs:simpleType,xs:complexType)会在遇到它们时放在输出中:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="HighSchoolType">
    <xs:sequence>
        <xs:element name="OrganizationName" type="core:OrganizationNameType"/>
        <xs:element name="OPEID" type="core:OPEIDType"/>
        <xs:simpleType name="OPEIDType"/>
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="OrganizationNameType"/>
</xs:schema>

我更喜欢xs:simpleType始终附加到根,无论在源中遇到模式的位置。 IE:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="HighSchoolType">
    <xs:sequence>
        <xs:element name="OrganizationName" type="core:OrganizationNameType"/>
        <xs:element name="OPEID" type="core:OPEIDType"/>
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="OrganizationNameType"/>
  <xs:simpleType name="OPEIDType"/>
</xs:schema>

此时是否可以停止重复?

这是我目前正在使用的模板:

<xsl:template match="xs:simpleType">
    <xsl:copy>
        <xsl:copy-of select="*[not(self::xs:annotation or self::xs:restriction)]|@*"/>
    </xsl:copy>
</xsl:template>

1 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/xs:schema">
        <xsl:copy>
            <xsl:apply-templates/>
            <xsl:copy-of select="//xs:simpleType"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[name()!='xs:simpleType' and name()!='xs:schema']">
        <xsl:copy>
            <xsl:apply-templates select="*|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>