转载

XML Schema

XML Schema

XML Schema为定义XML文档提供了一种更为丰富的语言。它的特点之一是其语言基于XML自身

另外一个优点是XML Schema允许用户通过拓展或限制已有的类型来定义新的类型

元素类型

minOccurs=“x”, maxOccurs=“x”, x可以为任意自然数。默认值为1

<element name="head" minOccurs="1" maxOccurs="1"/>

type=""下文的例子会详细说明

属性类型

use=“x", x可以是optional, required

use=“x” value="…", x可以是 default 或 fixed(value就是相应的值)

<attribute name="id" type="ID" use="required"/>
<element name="speaks" type="language" use="default" value="en"/>

数据类型

  • 数字型数据类型 Integer, Short, Byte, Long, Float, Decimal
  • 字符串类型 string ID IDREF CDATA Language
  • 日期和时间数据类型, time Date Month Year

简单数据类型(不可使用元素或者属性)

<simpleType name="dayOfWeek">
    <restriction base="string">
        <enumeration value="Mon"/>
        <enumeration value="Tue"/>
        <enumeration value="Wed"/>
        <enumeration value="Thu"/>
        <enumeration value="Fri"/>
        <enumeration value="Sat"/>
        <enumeration value="Sun"/>
    </restriction>
</simpleType>

复杂数据类型(可以使用元素和属性的复杂类型)

sequence: 已有数据类型元素的序列,按照预定义的次序出现

all: 必须出现的元素的集合,但出现的次序无关紧要

choice: 元素的集合,其中之一将被选择

<complexType name="lecturerType">
    <sequence>
        <element name="firstname" type="string" minOccurs="0" maxOccurs="unbounded"/>
        <element name="lastname" type="string"/>
    </sequence>
    <attribute name="title" type="string" use="optional"/>
</complexType>

数据类型的拓展

<complexType name="extendedLecturerType">
    <extension base="lectureType">
        <sequence>
            <element name="email" type="string" minOccurs="0" maxOccurs="1"/>
        </sequence>
        <attribute name="rank" type="string" use="required"/>
    </extension>
</complexType>

数据类型的限制

<complexType name="lecturerType">
    <restriction base="lecturerType">
        <sequence>
            <element name="firstname" type="string" minOccurs="1" maxOccurs="2"/>
            <element name="lastname" type="string"/>
        </sequence>
        <attribute name="title" type="string" use="required"/>
    </restriction>
</complexType>

命名空间

命名空间主要是为了解决命名冲突。

<h:table xmlns:h="http://www.w3.org/TR/html4/">
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>

<f:table xmlns:f="http://www.w3school.com.cn/furniture">
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>

定义默认的命名空间

<!--http://www.w3school.com.cn/furniture就是默认的命名空间-->
<table xmlns="http://www.w3school.com.cn/furniture">
   <name>African Coffee Table</name>
   <width>80</width>
   <length>120</length>
</table>

XML的显示

将xml转换为HTML文档

原来的XML文件

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="catalog.xsl"?>
<!-- Edited with XML Spy v2007 (http://www.altova.com) -->
<catalog>
	<cd>
		<title>Empire Burlesque</title>
		<artist>Bob Dylan</artist>
		<country>USA</country>
		<company>Columbia</company>
		<price>10.90</price>
		<year>1985</year>
	</cd>
	<cd>
		<title>Hide your heart</title>
		<artist>Bonnie Tyler</artist>
		<country>UK</country>
		<company>CBS Records</company>
		<price>9.90</price>
		<year>1988</year>
	</cd>
	<cd>
		<title>Greatest Hits</title>
		<artist>Dolly Parton</artist>
		<country>USA</country>
		<company>RCA</company>
		<price>9.90</price>
		<year>1982</year>
	</cd>
</catalog>

XSL文件

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
	<html>
		<body>
			<h2>Catalog</h2>
			<xsl:apply-templates/>
		</body>
	</html>
</xsl:template>

<xsl:template match="cd">
	<span style="color:#00ff00"><xsl:value-of select="title"/></span>
	<span style="color:#00ff00"><xsl:value-of select="country"/></span>
	<br></br>
</xsl:template>

xsl:apply-templates/

就着例子解释一下xsl:apply-templates

<xsl:apply-templates/>的意思是匹配所有的"/"的子元素

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <h2>Catalog</h2>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

所以输出的是纯文本,如下图

xsl:apply-templates也有select属性,比如<xsl:apply-templates select="catalog/cd/artist"/>

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <h2>Catalog</h2>
                <xsl:apply-templates select="catalog/cd/artist"/>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

输出的是artist的信息,如下图

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
	<html>
		<body>
			<h2>Catalog</h2>
			<xsl:apply-templates/>
		</body>
	</html>
</xsl:template>

<xsl:template match="cd">
	<span style="color:#00ff00"><xsl:value-of select="title"/></span>
	<span style="color:#00ff00"><xsl:value-of select="country"/></span>
	<br></br>
</xsl:template>
</xsl:stylesheet>

下面的代码,首先匹配了catalog的所有子元素,然后,XSL解释器会在下面寻找,是否,有对应的子元素

的模板,如果有就对子元素应用相应的模板。所以输出如下图

正文到此结束
本文目录