如何使用xpath在实例文档中按xsd类型选择元素?

时间:2017-12-28 15:53:49

标签: xml xslt xpath xsd

例如: 我的xsd是:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="Zoo">
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element ref="Animal"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element abstract="true" name="Animal"/>
    <xs:element name="Tiger" substitutionGroup="Animal" type="Tiger"/>
    <xs:element name="Wolf" substitutionGroup="Animal" type="Wolf"/>
    <xs:complexType name="Animal">
        <xs:attribute name="name"/>
    </xs:complexType>
    <xs:complexType name="Tiger">
        <xs:complexContent>
            <xs:extension base="Animal"/>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="Wolf">
        <xs:complexContent>
            <xs:extension base="Animal"/>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

我的实例文件是:

<Zoo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Zoo.xsd">
    <Tiger name="001"/>
    <Wolf name="002"/>
    <Wolf name="003"/>
</Zoo>

如何使用xpath选择复杂类型为Animal的所有元素? xpath可以使用xsd元信息吗?

1 个答案:

答案 0 :(得分:2)

使用模式感知处理器(如Saxon 9 EE或Altova XMLSpy / Raptor),您可以使用//element(*, Animal)https://www.w3.org/TR/xpath-31/#doc-xpath31-ElementTest)选择具有该类型Animal的所有元素,样式表看起来像

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:import-schema schema-location="Zoo.xsd"/>

    <xsl:template match="/">
        <xsl:copy-of select="//element(*, Animal)"/>
    </xsl:template>

</xsl:stylesheet>