xml课后答案

 
2.P.1
 
2_P_1.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element   name="BOOKDETAILS" type="bdata"/>
<xsd:complexType name="bdata">
<xsd:sequence>
<xsd:element name="BOOK" type="bk"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="bk">
 <xsd:sequence>
 <xsd:element name="TITLE" type="xsd:string"/>
 <xsd:element name="ISBN" type="isbnum"/>
 <xsd:element name="FIRSTNAME" type="xsd:string"/>
 <xsd:element name="LASTNAME" type="xsd:string"/>
 <xsd:element  name="PRICE" type="xsd:positiveInteger"/>
 </xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="isbnum">
 <xsd:restriction base="xsd:string">
 <xsd:pattern value="[I]{1}/d{1}/d{1}/d{1}"/>
 </xsd:restriction>
 </xsd:simpleType>
</xsd:schema>
 
 
 
2_P_1.xml
<?xml version="1.0"?>
<BOOKDETAILS>
<BOOK>
<TITLE>An Equal Music</TITLE>
<ISBN>I001</ISBN>
<FIRSTNAME>Vikram</FIRSTNAME>
<LASTNAME>Seth</LASTNAME>
<PRICE>450</PRICE>
</BOOK>
</BOOKDETAILS>
 

 
解决方案:独立实践
 
UGP 1.
 
2_UGP_1.xml
<?xml version="1.0"?>
<CUSTOMERDETAILS>
<CUSTOMER>
<CUSTOMERID>C098</CUSTOMERID>
<FIRSTNAME>Peter</FIRSTNAME>
<LASTNAME>Cole</LASTNAME>
<ADDRESS>24,Park Lane</ADDRESS>
</CUSTOMER>
</CUSTOMERDETAILS>
 
 
UGP 2.
 
2_UGP_2.dtd
<!ELEMENT STUDENTDETAILS (STUDENT)>
<!ELEMENT STUDENT (FNAME, LNAME, DATEOFBIRTH, SEM1MARK, SEM2MARK)> 
<!ELEMENT FNAME (#PCDATA)>
<!ELEMENT LNAME (#PCDATA)>
<!ELEMENT DATEOFBIRTH (#PCDATA)>
<!ELEMENT SEM1MARK (#PCDATA)>
<!ELEMENT SEM2MARK (#PCDATA)>
 
2_UGP_2.xml
<?xml version="1.0"?>
<!DOCTYPE STUDENTDETAILS SYSTEM "2_UGP_2.dtd">
<STUDENTDETAILS>
<STUDENT>
    <FNAME>Alice </FNAME>
    <LNAME>Peterson</LNAME>
    <DATEOFBIRTH>12/07/1974</DATEOFBIRTH>
    <SEM1MARK>89</SEM1MARK>
    <SEM2MARK>96</SEM2MARK>
</STUDENT>
</STUDENTDETAILS>
 
 
UGP 3.
 
2_UGP_3.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="MOVIEDETAILS" type="mdet"/>
<xsd:complexType name="mdet">
<xsd:sequence>
<xsd:element name="MOVIE" type="mve"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="mve">
 <xsd:sequence>
 <xsd:element name="TITLE" type="xsd:string"/>
 <xsd:element name="MOVIEID" type="mid"/>
 <xsd:element name="DIRNAME" type="xsd:string"/>
 <xsd:element name="CAST" type="xsd:string"/>
 <xsd:element name="YEAROFRELEASE" type="xsd:string"/> </xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="mid">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[M]{1}/d{1}/d{1}/d{1}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
 
 
2_UGP_3.xml
<?xml version="1.0"?>
<MOVIEDETAILS>
<MOVIE>
<TITLE>The Sixth Sense</TITLE>
<MOVIEID>M876</MOVIEID>
<DIRNAME>M Night Shyamalan</DIRNAME>
<CAST>Bruce Willis, Haley Joel Osment</CAST>
<YEAROFRELEASE> 1999</YEAROFRELEASE>
</MOVIE>
</MOVIEDETAILS>
 
 
UGP 4.
 
2_UGP_4.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element    name="RESERVATION"    type="res"/>
<xsd:complexType name="res">
 <xsd:sequence>
 <xsd:element    name="FROM"    type="fromdef"/>
 <xsd:element    name="TO"    type="fromdef"/>
 <xsd:element    name="FARE"    type="xsd:positiveInteger"/>
 <xsd:element    name="DATE"    type="xsd:date"/>
 <xsd:element    name="CLASS"   type="classdef"/>
 </xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="fromdef">
 <xsd:restriction base="xsd:string">
 <xsd:pattern value="(NY{1}|Chicago{1}|Miami{1}|Pittsburgh)"/>
 </xsd:restriction>
 </xsd:simpleType>
<xsd:simpleType name="classdef">
 <xsd:restriction base="xsd:string">
 <xsd:pattern value="(First{1}|Executive{1}|Economy{1})"/>
 </xsd:restriction>
 </xsd:simpleType>
</xsd:schema>
 
2_UGP_4.xml
<?xml version="1.0"?>
<RESERVATION>
<FROM>NY</FROM>
<TO>Chicago</TO>
<FARE>200</FARE>
<DATE>2001-03-29</DATE>
<CLASS>Executive</CLASS>
</RESERVATION>
 
UGP 5.
 
2_UGP_5.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="ACCOUNTINFORMATION">
    <xsd:complexType>
       <xsd:sequence>
           <xsd:element   name="MAILINFORMATION"    type="mailinfo"/>
           <xsd:element   name="ADDRESSBOOKINFORMATION"    type="addressbookinfo"/>
       </xsd:sequence>
    </xsd:complexType>
</xsd:element>
<xsd:complexType name="mailinfo">
    <xsd:sequence>
       <xsd:element   name="MAILTYPE"    type="mailtype"/>
       <xsd:element   name="FROM"    type="xsd:string"/>
       <xsd:element   name="SUBJECT"    type="xsd:string"/>
       <xsd:element   name="DATE"    type="xsd:date"/>
        <xsd:element   name="SIZE"   type="xsd:positiveInteger"/>
       <xsd:element   name="PRIORITY"   type="priority"/>
     </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="addressbookinfo">
    <xsd:sequence>
       <xsd:element   name="QUICKNAME"    type="xsd:string"/>
       <xsd:element   name="NAME"    type="xsd:string"/>
       <xsd:element   name="EMAILID"    type="xsd:string"/>
     </xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="mailtype">
    <xsd:restriction base="xsd:string">
       <xsd:pattern value="MAIL|NEWS"/>
    </xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="priority">
    <xsd:restriction base="xsd:string">
       <xsd:pattern value="LOW|MEDIUM|HIGH"/>
    </xsd:restriction>
</xsd:simpleType>
</xsd:schema>
 
2_UGP_5.xml
<?xml version="1.0"?>
<ACCOUNTINFORMATION>
    <MAILINFORMATION>
       <MAILTYPE>NEWS</MAILTYPE>
       <FROM>abcd@xyz.com</FROM>
       <SUBJECT>Trial Mail</SUBJECT>
       <DATE>2001-03-29</DATE>
       <SIZE>12</SIZE>
       <PRIORITY>LOW</PRIORITY>
    </MAILINFORMATION>
    <ADDRESSBOOKINFORMATION>
       <QUICKNAME>trial</QUICKNAME>
       <NAME>trial name</NAME>
       <EMAILID>abcd@xyz.com</EMAILID>
    </ADDRESSBOOKINFORMATION>
</ACCOUNTINFORMATION>
第三课
解决方案:稍等一 下…
1.       除了存储书的名称,作者的名和姓,书的价格以外,你还需要存储书的ID和每本书封面的类型。封面的类型可以是硬的或是软的。声明存储书的详细信息所需的元素和属性。书的ID也可以用在不同的存储产品数据的XML文档中。保证书的属性ID是可以重用的。
3_JAM_1.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:attribute name="BOOKID" type="xsd:string"/>
<xsd:element   name="BOOKDATA" type="bodata"/>
<xsd:complexType name="bodata">
<xsd:sequence>
<xsd:element name="BOOK" type="bk"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="bk">
 <xsd:sequence>
 <xsd:element name="BOOKNAME" type="xsd:string"/>
 <xsd:element name="AFNAME" type="xsd:string"/>
 <xsd:element name="ALNAME" type="xsd:string"/>
 <xsd:element name="PRICE" type="xsd:positiveInteger"/>
 </xsd:sequence>
 <xsd:attribute ref="BOOKID"/>
 <xsd:attribute name="BOOKCOVER" type="bc" use="required"/>
</xsd:complexType>
<xsd:simpleType name="bc">
<xsd:restriction base="xsd:string">
<xsd:pattern value="Hard|Soft"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
 
3_JAM_1.xml
<?xml version="1.0"?>
<BOOKDATA>
<BOOK BOOKID="B001" BOOKCOVER="Soft">
<BOOKNAME>Jurassic Park</BOOKNAME>
<AFNAME>Michael</AFNAME>
<ALNAME>Crichton</ALNAME>
<PRICE>200</PRICE>
</BOOK>
</BOOKDATA>
 
2.       CyberShoppe 的分公司要把它们的销售记录传给总公司。为了保证不管总公司的使用什么硬件和软件,这些数据都能被访问,分公司需要以XML形式储存数据。当总公司接收到数据,它需要保证所有的分公司都给出了所有需要的信息。还要保证各个分公司都以一致的格式传送数据。
各个分公司传送的销售记录详细信息包括产品ID、交易ID、交易时间、顾客ID、定购数量和单价。
产品ID、交易ID、顾客ID在许多文档中重复使用。建立可重用的数据类型来储存这些详细信息。还要建立一个使用这些数据类型来存储销售记录的详细信息的XML 模式。产品ID应当是“P[0-9][0-9][0-9]”的形式
 
3_JAM_2_a.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="www.ecomatcybershop.com/sale">
<simpleType name="prstring">
<restriction base="string">
<pattern value="[P]{1}/d{3}"/>
</restriction>
</simpleType>
<simpleType name="orstring">
<restriction base="string">
<pattern value="[O]{1}/d{3}"/>
</restriction>
</simpleType>
<simpleType name="custstring">
<restriction base="string">
<pattern value="[C]{1}/d{3}"/>
</restriction>
</simpleType>
</schema>
 
3_JAM_2_b.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="www.ecomatcybershop.com/sale"
xmlns:prd="www.ecomatcybershop.com/sale">
<include schemaLocation="3_JAM_2_a.xsd"/>
<element name="SALES" type="prd:saletran"/>
<complexType name="saletran">
<sequence>
<element name="TRAN" type="prd:tran"/>
</sequence>
</complexType>
<complexType name="tran">
<sequence>
<element name="DATE" type="date"/>
<element    name="QUANTITY" type="positiveInteger"/>
<element    name="PRICEPERUNIT"   type="positiveInteger"/>
</sequence>
<attribute name="PRODID" type="prd:prstring"/>
<attribute name="TRANID" type="prd:orstring" use="required"/>
<attribute name="CUSTID" type="prd:custstring" use="required"/>
</complexType>
</schema>
 
3_JAM_2.xml
<?xml version="1.0"?>
<prod:SALES xmlns:prod="www.ecomatcybershop.com/sale" >
<TRAN PRODID="P001" TRANID="O001" CUSTID="C001">
<DATE>2000-02-13</DATE>
<QUANTITY>3</QUANTITY>
<PRICEPERUNIT>20</PRICEPERUNIT>
</TRAN>
</prod:SALES>
 
当验证上面的XML文档时,验证其对于 3_JAM_2_b.xml的正确性。
第四课
问题解决
在本课的最后,学生将做一个综合练习,该练习覆盖了我们学到的所有关于XML 模式的概念。
解决方案:稍等一下…
1. CyberShoppe 把它的书卖给顾客。书的详细信息包括书的名称,书的作者的名字,书的价格。书作者的名字可以使用元素NAME 输入也可以使用元素FIRSTNAME 和LASTNAME输入。
4_JAM_1.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:group name="auname">
<xsd:sequence>
<xsd:element name="FIRSTNAME" type="xsd:string"/>
<xsd:element name="LASTNAME" type="xsd:string"/>
</xsd:sequence>
</xsd:group>
<xsd:element name="BOOKS" type="bktype"/>
<xsd:complexType name="bktype">
    <xsd:sequence>
       <xsd:element name="BOOK" type="bk" minOccurs="1" maxOccurs="unbounded" />
    </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="bk">
<xsd:sequence>
    <xsd:element name="TITLE" type="xsd:string"/>
    <xsd:element name="AUTHOR" type="autype"/>
    <xsd:element name="PRICE" type="xsd:positiveInteger" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="autype">
<xsd:choice>
<xsd:group ref="auname"/>
<xsd:element name="NAME" type="xsd:string"/>
</xsd:choice>
</xsd:complexType>
</xsd:schema>
 
 
4_JAM_1.xml
<?xml version="1.0"?>
<BOOKS>
   <BOOK>
      <TITLE> If Tomorrow Comes </TITLE>
      <AUTHOR>
          <FIRSTNAME> Sydney </FIRSTNAME>
          <LASTNAME> Sheldon </LASTNAME>
      </AUTHOR>
      <PRICE> 20 </PRICE>
   </BOOK>
   <BOOK>
      <TITLE> The Client </TITLE>
      <AUTHOR>
             <NAME> John Grisham </NAME>
      </AUTHOR>
      <PRICE> 20 </PRICE>
   </BOOK>
</BOOKS>
 
解决方案:有指导实践
4.P.1.
 
4_P_1_a.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.ecomatcybershoppe.com/supplier"
    xmlns:supp="http://www.ecomatcybershoppe.com/supplier">
<simpleType name="suppstring">
<restriction base="string">
<pattern value="[S]{1}/d{3}"/>
</restriction>
</simpleType>
<complexType name="address">
 <sequence>
 <element name="STREET" type="string"/>
 <element name="CITY" type="string"/>
 <element name="STATE" type="string"/>
 <element name="ZIP" type="string"/>
 </sequence>
</complexType>
</schema>
 
4_P_1_b.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema"
   targetNamespace="http://www.ecomatcybershoppe.com/supplier"
   xmlns:supp="http://www.ecomatcybershoppe.com/supplier">
   <include schemaLocation="4_P_1_a.xsd"/>
   <element name="SUPPLIERDETAILS">
      <complexType>
          <sequence>
             <element name="SUPPLIER" type="supp:suppdata" maxOccurs="unbounded"/>
          </sequence>  
      </complexType>
   </element>
 
   <complexType name="suppdata">
      <sequence>
          <group ref="supp:suppgrp"/>
          <element name="ADDRESS" type="supp:address"/>
          <element name="PHONE" type="string"/>
          <element name="TYPE" type="supp:suppliertype"/>
      </sequence>
      <attribute name="SUPPLIERID" type="supp:suppstring"/>
   </complexType>
  
   <group name="suppgrp">
      <choice>
       <sequence>
          <element name="FIRSTNAME" type="string"/>
          <element name="LASTNAME" type="string"/>
         </sequence>
      <element name="NAME" type="string" />
      </choice>
   </group>
 
   <simpleType name="suppliertype">
      <restriction base="string">
          <pattern value="(Individual|Company)"/>
      </restriction>
   </simpleType>
</schema>
 
4_P_1.xml
<?xml version="1.0"?>
<supp1:SUPPLIERDETAILS xmlns:supp1="http://www.ecomatcybershoppe.com/supplier">
    <SUPPLIER SUPPLIERID="S001">
       <FIRSTNAME> Keith </FIRSTNAME>
       <LASTNAME> Williams </LASTNAME>
       <ADDRESS>
           <STREET> LIONS STREET </STREET>
           <CITY> DAVENPORT</CITY>
           <STATE> IOWA </STATE>
           <ZIP> 234-1223 </ZIP>
       </ADDRESS>
       <PHONE> 294-234-1223 </PHONE>
       <TYPE>Company</TYPE>
    </SUPPLIER>
</supp1:SUPPLIERDETAILS>
 
使用XML 模式验证器验证 4_P_1.xml对于包含在 4_P_1_b.xsd中的模式的正确性。

 
解决方案:独立实践
UGP 1.
 
4_UGP_1.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element   name="MOVIEDETAILS" type="mdata"/>
<xsd:complexType name="mdata">
<xsd:sequence>
<xsd:element name="MOVIE" type="mov"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="mov">
 <xsd:sequence>
 <xsd:element name="DATEOFRELEASE" type="xsd:date"/>
 <xsd:element name="MOVIENAME" type="xsd:string"/>
 <xsd:element name="CAST" type="xsd:string"/>
 <xsd:element name="DIRECTOR" type="xsd:string"/>
 <xsd:element name="AWARDS" type="xsd:string"/>
 </xsd:sequence>
 <xsd:attribute name="MOVIEID" type="xsd:string" use="required"/>
 <xsd:attribute name="CATEGORY" type="cat" use="required"/>
 <xsd:attribute name="LENGTH" type="xsd:positiveInteger" use="required"/>
</xsd:complexType>
<xsd:simpleType name="cat">
<xsd:restriction base="xsd:string">
<xsd:pattern value="Horror|Comedy|Romance|Drama|Action"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
 
 
4_UGP_1.xml
<?xml version="1.0"?>
<MOVIEDETAILS>
<MOVIE MOVIEID="M007" CATEGORY="Horror" LENGTH="120">
<DATEOFRELEASE>1973-04-18</DATEOFRELEASE>
<MOVIENAME>The Exorcist</MOVIENAME>
<CAST>Ellen Burstyn</CAST>
<DIRECTOR>William Friedkin</DIRECTOR>
<AWARDS>3</AWARDS>
</MOVIE>
</MOVIEDETAILS>
 
UGP 2.
4_UGP_2_a.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema"
   targetNamespace="http://www.ecomatcybershoppe.com/employee"
   xmlns:emp="http://www.ecomatcybershoppe.com/employee">
   <simpleType name="empstring">
      <restriction base="string">
          <pattern value="[E]{1}/d{3}"/>
      </restriction>
   </simpleType>
</schema>
 
4_UGP_2_b.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema"
   targetNamespace="http://www.ecomatcybershoppe.com/employee"
   xmlns:emp="http://www.ecomatcybershoppe.com/employee">
 
   <include schemaLocation="4_UGP_2_a.xsd"/>
 
 
   <element name="EMPLOYEEDETAILS">
      <complexType>
          <sequence>
             <element   name="EMPLOYEE"    type="emp:empdata" maxOccurs="unbounded"/>
          </sequence>  
      </complexType>
   </element>
 
   <complexType name="empdata">
      <sequence>
          <element   name="NAME" type="string"/>
          <element   name="ADDRESS" type="string"/>
          <element   name="DESIGNATION" type="string"/>
          <element   name="DEPARTMENT"   type="string"/>
          <element   name="DATEOFJOINING"   type="date"/>
      </sequence>
      <attribute name="EMPID" type="emp:empstring"/>
   </complexType>
</schema>
 
4_UGP_2.xml
<?xml version="1.0"?>
<emp1:EMPLOYEEDETAILS xmlns:emp1="http://www.ecomatcybershoppe.com/employee">
    <EMPLOYEE EMPID="E001">
       <NAME>John</NAME>
       <ADDRESS>12,</ADDRESS>
       <DESIGNATION>Sales Executive</DESIGNATION>
       <DEPARTMENT>Sales and Invoicing </DEPARTMENT>
       <DATEOFJOINING>2001-03-29</DATEOFJOINING>
    </EMPLOYEE>
</emp1:EMPLOYEEDETAILS>
 
UGP 3.
 
4_UGP_3.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
<xsd:element name="JOBDETAILS">
    <xsd:complexType>
       <xsd:sequence>
           <xsd:element name="JOB" type="jobinformation" maxOccurs="unbounded"/>
       </xsd:sequence>
    </xsd:complexType>
</xsd:element>
    <xsd:complexType name="jobinformation">
       <xsd:sequence>
           <xsd:element name="COMPANYNAME" type="xsd:string"/>
           <xsd:element name="JOBDESCRIPTION" type="xsd:string"/>
           <xsd:element name="EXPERIENCE" type="xsd:nonNegativeInteger"/>
           <xsd:element name="QUALIFICATION" type="qualificationtype"/>                                                             
           <xsd:element name="CONTACTINFO" type="contactinfo"/>                                                                                                       <xsd:element name="SALARY" type="xsd:positiveInteger"/>
           <xsd:element name="JOBTYPE" type="jobtype"/>
       </xsd:sequence>
       <xsd:attribute name="JOBID" type="jobid" use="required"/>
    </xsd:complexType>
 
 
    <xsd:complexType name="qualificationtype">
       <xsd:choice>
           <xsd:element name="STRICTQUALIFICATION" type="strictqual" />
           <xsd:element name="RELAXEDQUALIFICATION" type="relaxedqual" />
       </xsd:choice>
    </xsd:complexType>
 
   
    <xsd:complexType name="strictqual">
       <xsd:group ref="strictqualref" />
    </xsd:complexType>
 
    <xsd:complexType name="relaxedqual">
       <xsd:choice>
           <xsd:element name="GRADUATE" type="xsd:string"/>
           <xsd:element name="POSTGRADUATE" type="xsd:string"/>
       </xsd:choice>
    </xsd:complexType>
 
    <xsd:group name="strictqualref">
       <xsd:sequence>
           <xsd:element name="GRADUATE" type="xsd:string"/>
           <xsd:element name="POSTGRADUATE" type="xsd:string"/>
       </xsd:sequence>
    </xsd:group>
 
    <xsd:simpleType name="jobid">
       <xsd:restriction base="xsd:string">
           <xsd:pattern value="[J]/d{3}"/>
       </xsd:restriction>
 
    </xsd:simpleType>
    <xsd:complexType name="contactinfo">
       <xsd:choice>
           <xsd:element name="EMAIL" type="xsd:string" />
           <xsd:element name="ADDRESS" type="xsd:string" />
       </xsd:choice>
    </xsd:complexType>
 
    <xsd:simpleType name="jobtype">
       <xsd:restriction base="xsd:string">
           <xsd:pattern value= "(CONTRACT|PERMANENT)"/>
       </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>
 
4_UGP_3.xml
<?xml version="1.0"?>
<JOBDETAILS>
    <JOB JOBID="J001">
       <COMPANYNAME>Flamingo Inc. </COMPANYNAME>
       <JOBDESCRIPTION>MKTG MGR</JOBDESCRIPTION>
       <EXPERIENCE>3</EXPERIENCE>
       <QUALIFICATION>
           <STRICTQUALIFICATION>
              <GRADUATE>Bachelor of Commerce</GRADUATE>
              <POSTGRADUATE>Business Admin</POSTGRADUATE>
           </STRICTQUALIFICATION>         
       </QUALIFICATION>
       <CONTACTINFO>
           <EMAIL>abc@xyz.com</EMAIL>
       </CONTACTINFO>
       <SALARY>5000</SALARY>
       <JOBTYPE>PERMANENT</JOBTYPE>
    </JOB>
    <JOB JOBID="J002">
       <COMPANYNAME>ABC Inc.</COMPANYNAME>
       <JOBDESCRIPTION>Tech Writing</JOBDESCRIPTION>
       <EXPERIENCE>3</EXPERIENCE>
       <QUALIFICATION>
           <RELAXEDQUALIFICATION>
              <GRADUATE>B.A.</GRADUATE>
           </RELAXEDQUALIFICATION>        
       </QUALIFICATION>    
       <CONTACTINFO>
           <EMAIL>abc@xyz.com</EMAIL>
       </CONTACTINFO>      
       <SALARY>1200</SALARY>
       <JOBTYPE>CONTRACT</JOBTYPE>
</JOB>
</JOBDETAILS>
第五课
经验
你可以通过讨论数据的转换和数据如何在各种目标对象(如Web浏览器、e-mail、呼机、移动电话)上表示。讨论这些设备翻译数据使用的不同的翻译语言。除了CSS和XSL以外,你还可以使用如DSSSL的翻译语言。DSSSL在附录里有介绍。建议你在学习这一课以前先阅读DSSSL部分。
在说明样式表的概念以前说明格式化数据的重要性。重新强调XML是一种提供内容的结构的标记语言,而不是为了向用户表示数据的。正因为这样,你才需要使用样式表。
CSS和XSL文件都可以用记事本建立并分别以css和xsl扩展名保存。
通过在浏览器中用CSS转换数据,实际数据和用来显示数据的信息分割开来。这确保相同的XML文档能为了不同的目的(如打印、在Web上显示数据、做演示)而被转换。因为两者是分开的,所以不会造成数据的修改。
说明编制CSS文件的语法。为了把格式化的信息和XML文档关联起来,学生需要在XML文件中使用下面的语法:
<?xml-stylesheet type="text/css" href="path-name"?>
要查看输出结果,学生需要使用浏览器打开XML文件。
在讨论XSL时,告诉学生CSS不能用于执行如基于某一特定条件的元素重排和排序等操作。
当说明XSLT处理机的工作过程时,要提及IE 5.0的MSXML解析器的版本是2.5。MS XML 4.0解析器的beta版可以在下面的网址下载:
http://www.microsoft.com/downloads
还要告诉学生IE 5.0的MSXML解析器是旧版本。因此,它不支持XSLT的很多标签。同样,旧版本的XSL规范的命名空间声明如下:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
另一方面,新的规范使用如下的命名空间声明:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version=“1.0”>
你很可能面对学生关于XSLT和Xpath学习模块格式的提问。告诉他们我们学习这个格式是因为IE 5.0使用MSXML 2.5。即使你载入MSXML 4.0,新的版本和旧版本并行。因此,当你试着把XSLT文档和XML文档关联起来的时候,IE 5.0不会识别出命名空间URI。它仍然认可旧的命名空间URI。因此,你需要使用这个脚本。该脚本把XML文档和XSLT样式表载入各种对象并把XSLT样式表与XML文档相关联。还要告诉学生他们将在第八课学习编写这样的脚本。
例子和类比
格式化数据和用不同的颜色和字体表示数据的可以说明成一个吸引学生注意的方法。例如,当表示票的详细信息的时候,等待中的乘客的名字可以用和已经买到票的乘客的名字不同的颜色表示。
在说明数据排序时,可以告诉学生XSLT的元素sort和SQL Server的ORDER BY子句一样。还要告诉学生可以在元素for-each中使用多个元素sort。因此,你可以很容易地实现基于两个或者多个元素的排序。
 
常见问题
1. 我可以同时使用 CSS XSLT 吗?
可以。你可以用XSLT把XML数据转换成一定的结构,如列表和表格,然后将CSS应用于该转换结果以便控制这些结构在适当媒介中的显示方式。
2. 我可以在什么地方使用xsl:sort 元素?
xsl:sort可以作为xsl:for-each元素或xsl:apply-templates元素的子元素。
3. 为什么使用xsl:apply-templates 元素?
在做基于模板的格式化时使用xsl:apply-templates 元素。xsl:apply-templates 元素告诉XSLT处理机找到相应的xsl:template 。
解决方案:稍等一下…
1. CyberShoppe 销售的所有的书详细信息以如下形式显示:
n      书名用篮色、字体Times New Roman、大小20pts、粗体显示。
n      作者的名和姓(姓名)用绿色、字体Arial、大小10pts显示。
n      的价格用红色、字体Times New Roman、大小20pts显示。
建立CSS来显示以上形式的书的详细信息。
5_JAM_1.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="5_JAM_1.css"?>
<BOOKDETAILS>
 <BOOK BOOKID="B001">
   <BOOKNAME>ANNE OF GREEN GABLES</BOOKNAME>
   <AFNAME>LUCY MAUD</AFNAME>
   <ALNAME>MONTGOMERY</ALNAME>
   <PRICE>150.00</PRICE>
 </BOOK>
 <BOOK BOOKID="B002">
   <BOOKNAME>MIND READING IN PUBLIC</BOOKNAME>
   <AFNAME>ABBOTT</AFNAME>
   <ALNAME>DAVID PHELPS</ALNAME>
   <PRICE>250.00</PRICE>
 </BOOK>
 <BOOK BOOKID="B003">
   <BOOKNAME>THE OUTLET</BOOKNAME>
   <AFNAME>ADAMS</AFNAME>
   <ALNAME>ANDY</ALNAME>
   <PRICE>200.00</PRICE>
 </BOOK>
</BOOKDETAILS>
 

 
5_JAM_1.css
BOOKNAME
{
font-size:20pts;
font-weight:bold;
color:blue;
}
AFNAME,ALNAME
{
font-size:10pts;
color:green;
}
PRICE
{
font-size:20pts;
color:red;
}
 
 
解决方案:有指导实践
 
5.P.1.
 
5_P_1.xml
<?xml version="1.0"?>
<BOOKDETAILS>
 <BOOK BOOKID="B001">
   <TITLE>ANNE OF GREEN GABLES</TITLE>
   <AFNAME>LUCY MAUD</AFNAME>
   <ALNAME>MONTGOMERY</ALNAME>
   <PRICE>150.00</PRICE>
 </BOOK>
 <BOOK BOOKID="B002">
   <TITLE>MIND READING IN PUBLIC</TITLE>
   <AFNAME>ABBOTT</AFNAME>
   <ALNAME>DAVID PHELPS</ALNAME>
   <PRICE>250.00</PRICE>
 </BOOK>
 <BOOK BOOKID="B003">
   <TITLE>THE OUTLET</TITLE>
   <AFNAME>ADAMS</AFNAME>
   <ALNAME>ANDY</ALNAME>
   <PRICE>200.00</PRICE>
  </BOOK>
</BOOKDETAILS>
 
5_P_1.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:for-each select="BOOKDETAILS/BOOK">
<xsl:sort select="PRICE" />
<xsl:sort select="@BOOKID" />
<LI>
       <xsl:value-of select="@BOOKID"/>
    <xsl:value-of select="TITLE"/>
    <xsl:value-of select="PRICE"/>
</LI>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
 
第六课
经验
你可以通过说明XPath的重要性来开始这一课。XPath是为XML定义的,为选择XML文档中节点的子集提供简单语法的查询语言。XPath把XML文档视为由相关的分支和节点组成的树形结构,在这种树形结构里,节点可能是文档中元素,属性,处理指令(PI),注释,文本,命名空间的任何一种。
告诉学生可以使用一套操作符和特殊的字符建立XPath表达式。你可以让学生用这些操作符和特殊字符写出一些XPath表达式。
讨论XPath函数返回的值,然后讨论函数的不同类型,如字符串、布尔型、节点集、数值型。使用操作符和XPath函数,学生可以计算数据并把它显示在汇总报表上。
确定所有学生的机器上都有 Learning Environment文件夹。如果XML和XSLT文件在不同的文件夹里,让学生在XSLT和XPATH学习模块窗体的相应文本框中输入这些文件的完整路径。
在开始讲授“在XSLT中使用HTML标签”这部分内容之前,你可以先就给用户显示数据的方法这方面讨论XML的局限性。然后说明HTML支持的各种格式化方法。
例子和类比
当讨论XPath如何把XML文档视为由相应的分支和节点组成的树形结构时,你可以把它和Windows Explorer的树性视图相比较。Windows Explorer的每一个文件夹和XML文档树形结构中的文档都是类似的。
为了更好的理解Xpath函数,你可以把它和任何其它编程语言的函数相比较。你讨论的编程语言必须建立在批配制文件的基础上。
在说明xsl:if 和xsl:choose元素时,把它们分别与if-then结构以及switch-case结构比较。
常见问题
1. 什么时候要使用 * 操作符?
*操作符可用于选择所有元素而不管元素是什么名称。还可以用对两个数值做乘法。
 
2. 下面的代码表示什么?
STUDENTDTLS/STUDENT[@ID='S001']
给出的代码是XPath表达式的一个例子,它用于检索根元素STUDENTDTLS的子元素STUDENT,而且该元素的ID属性值为S001。
3. boolean(-100) 返回什么?
Boolean(-100)将返回true。
4. 为什么在某些计算中我得到“ NaN ”?
NaN代表不是数值(Not a Number)。这个值通常在执行文本节点的计算或指定节点的路径不正确时出现。如果有这类错误,检查Xpath表达式。
解决方案:稍等一下…
1.需要显示CyberShoppe 卖的书的详细信息。价格高于$100的书要显示成红色,价格高于$75的书显示成蓝色,其他的显示成绿色。
 
6_JAM_1.xml
<?xml version="1.0"?>
<BOOKDETAILS>
 <BOOK BOOKID="B001">
   <BOOKNAME>ANNE OF GREEN GABLES</BOOKNAME>
   <AFNAME>LUCY MAUD</AFNAME>
   <ALNAME>MONTGOMERY</ALNAME>
   <PRICE>50.00</PRICE>
 </BOOK>
 <BOOK BOOKID="B002">
   <BOOKNAME>MIND READING IN PUBLIC</BOOKNAME>
   <AFNAME>ABBOTT</AFNAME>
   <ALNAME>DAVID PHELPS</ALNAME>
   <PRICE>250.00</PRICE>
 </BOOK>
 <BOOK BOOKID="B003">
   <BOOKNAME>THE OUTLET</BOOKNAME>
   <AFNAME>ADAMS</AFNAME>
   <ALNAME>ANDY</ALNAME>
   <PRICE>76.00</PRICE>
 </BOOK>
</BOOKDETAILS>
 
 
6_JAM_1.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
     <xsl:for-each select="BOOKDETAILS/BOOK">
     <xsl:choose>
          <xsl:when test="PRICE[. &gt; 100]">
               <font color="red">
          BOOK NAME:<xsl:value-of select="BOOKNAME"/><BR/>
          AUTHOR: <xsl:value-of select="AFNAME"/> <xsl:text> </xsl:text> <xsl:value-of select="ALNAME" /><BR/>
          PRICE: <xsl:value-of select="PRICE"/><BR/>
          <HR/> <!--Displays a horizontal rule -->
               </font>
      </xsl:when>
        <xsl:when test="PRICE[. &gt; 75 and . &lt; 100]">
               <font color="blue">
          BOOK NAME:<xsl:value-of select="BOOKNAME"/><BR/>
          AUTHOR: <xsl:value-of select="AFNAME"/> <xsl:text> </xsl:text> <xsl:value-of select="ALNAME" /><BR/>
          PRICE: <xsl:value-of select="PRICE"/><BR/>
          <HR/> <!--Displays a horizontal rule -->
               </font>
      </xsl:when>
      <xsl:otherwise>
          <font color="green">
          BOOK NAME:<xsl:value-of select="BOOKNAME"/><BR/>
          AUTHOR: <xsl:value-of select="AFNAME"/> <xsl:text> </xsl:text> <xsl:value-of select="ALNAME" /><BR/>
          PRICE: <xsl:value-of select="PRICE"/><BR/>
          <HR/> <!--Displays a horizontal rule -->
          </font>
      </xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
 
解决方案:有指导实践
6.P.1.
 
6_P_1.xml
<?xml version="1.0"?>
<SUPPLIERDATA>
    <SUPPLIER SUPPID="S001">
       <FIRSTNAME> JANE </FIRSTNAME>
 
 
 
 
       <LASTNAME> PETERSON </LASTNAME>
       <ADDRESS> 10, LIONS RD, BOSTON </ADDRESS>
       <PHONE> 344-345-4456 </PHONE>
       <PRODUCT PRODID="P001">
              <PRODUCTNAME> BARBIE DOLL </PRODUCTNAME>
              <DESCRIPTION> TOY FOR CHILDREN IN THE AGE GROUP OF 5-10 </DESCRIPTION>
              <PRICE> 20 </PRICE>
       </PRODUCT>
       <PRODUCT PRODID="P002">
              <PRODUCTNAME> MINI BUS </PRODUCTNAME>
              <DESCRIPTION> TOY FOR CHILDREN IN THE AGE GROUP OF 6-11 </DESCRIPTION>
              <PRICE> 75 </PRICE>
       </PRODUCT>
       </SUPPLIER>
    <SUPPLIER SUPPID="S002">
       <FIRSTNAME> Peter </FIRSTNAME>
       <LASTNAME> Mathew </LASTNAME>
       <ADDRESS> 15, LIONS RD, BOSTON </ADDRESS>
       <PHONE> 344-345-4346 </PHONE>
       <PRODUCT PRODID="P003">
              <PRODUCTNAME> TEDDY BEAR </PRODUCTNAME>
              <DESCRIPTION> TOY FOR CHILDREN IN THE AGE GROUP OF 5-10 </DESCRIPTION>
              <PRICE> 10 </PRICE>
       </PRODUCT>
    </SUPPLIER>
    <SUPPLIER SUPPID="S003">
       <FIRSTNAME> John </FIRSTNAME>
       <LASTNAME> Norton </LASTNAME>
       <ADDRESS> 20, LIONS RD, BOSTON </ADDRESS>
       <PHONE> 344-345-2346 </PHONE>
       <PRODUCT PRODID="P001">
              <PRODUCTNAME> BARBIE DOLL</PRODUCTNAME>
              <DESCRIPTION> TOY FOR CHILDREN IN THE AGE GROUP OF 5-10 </DESCRIPTION>
              <PRICE> 20 </PRICE>
       </PRODUCT>
    </SUPPLIER>
    <SUPPLIER SUPPID="S004">
       <FIRSTNAME> Nick </FIRSTNAME>
       <LASTNAME> Mathew </LASTNAME>
       <ADDRESS> 25, LIONS RD, BOSTON </ADDRESS>
       <PHONE> 344-345-3445 </PHONE>
       <PRODUCT PRODID="P005">
              <PRODUCTNAME> TRAIN </PRODUCTNAME>
              <DESCRIPTION> TOY FOR CHILDREN IN THE AGE GROUP OF 5-10 </DESCRIPTION>
              <PRICE> 50 </PRICE>
       </PRODUCT>
    </SUPPLIER>
 
 
</SUPPLIERDATA>
 
 
 
6_P_1.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="PRODUCT">
    <xsl:value-of select="PRODUCTNAME" />
       <xsl:if test="position()!=last()"> , </xsl:if>
</xsl:template>
<xsl:template match="/">
<table border="2">
<thead>
    <tr>
    <th> ID </th> <th> First Name </th> <th> Last Name </th> <th> Address </th>
    <th> Phone </th> <th> Products </th>
    </tr>
</thead>
<tbody>
<xsl:for-each select="SUPPLIERDATA/SUPPLIER">
<tr>
    <xsl:choose>
    <xsl:when test="position() mod 2 = 0">   
      
           <td> <font color="red"><xsl:value-of select="@SUPPID"/> </font></td>
           <td><font color="red"><xsl:value-of select="FIRSTNAME"/></font></td>
           <td><font color="red"><xsl:value-of select="LASTNAME"/></font></td>
           <td><font color="red"><xsl:value-of select="ADDRESS"/></font></td>
           <td> <font color="red"><xsl:value-of select="PHONE"/> </font></td>
           <td><font color="red"><xsl:apply-templates select="PRODUCT"/> </font></td>
    </xsl:when>
    <xsl:otherwise>
       <td>  <xsl:value-of select="@SUPPID"/></td>
       <td><xsl:value-of select="FIRSTNAME"/></td>
       <td><xsl:value-of select="LASTNAME"/></td>
       <td><xsl:value-of select="ADDRESS"/></td>
       <td> <xsl:value-of select="PHONE"/> </td>
       <td><xsl:apply-templates select="PRODUCT"/></td>
    </xsl:otherwise>
    </xsl:choose>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
 
 
解决方案:独立实践
UGP 1.
 
6_UGP_1.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="6_UGP_1.css"?>
<EMPDETAILS>
 <EMP EMPID="E001">
   <ENAME>Karen</ENAME>
   <DESG>MANAGER</DESG>
   <DEPT>SALES</DEPT>
   <SALARY>250</SALARY>
 </EMP>
 <EMP EMPID="E002">
   <ENAME>George</ENAME>
   <DESG>Executive</DESG>
   <DEPT>ACCOUNTS</DEPT>
   <SALARY>300</SALARY>
 </EMP>
 <EMP EMPID="E003">
   <ENAME>Steve</ENAME>
   <DESG>Manager</DESG>
   <DEPT>FINANCE</DEPT>
   <SALARY>320</SALARY>
 </EMP>
 <EMP EMPID="E004">
   <ENAME>Ricky</ENAME>
   <DESG>Clerk</DESG>
   <DEPT>SALES</DEPT>
   <SALARY>150</SALARY>
 </EMP>
 <EMP EMPID="E005">
   <ENAME>Richard</ENAME>
   <DESG>Divisional Manager</DESG>
   <DEPT>MARKETING</DEPT>
   <SALARY>375</SALARY>
 </EMP>
</EMPDETAILS>
 
6_UGP_1.css
ENAME,SALARY
{
font-size:20pts;
color:blue;
}
 
DESG,DEPT
{
font-size:10pts;
color:green;
}
 
UGP 2.
6_UGP_2.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="6_UGP_2.xsl"?>
<EMPDETAILS>
 <EMP EMPID="E001">
   <ENAME>Karen</ENAME>
   <DESG>MANAGER</DESG>
   <DEPT>SALES</DEPT>
   <SALARY>230</SALARY>
 </EMP>
 <EMP EMPID="E002">
   <ENAME>George</ENAME>
   <DESG>Executive</DESG>
   <DEPT>ACCOUNTS</DEPT>
   <SALARY>300</SALARY>
 </EMP>
 <EMP EMPID="E003">
   <ENAME>Steve</ENAME>
   <DESG>Manager</DESG>
   <DEPT>FINANCE</DEPT>
   <SALARY>320</SALARY>
 </EMP>
 <EMP EMPID="E004">
   <ENAME>Ricky</ENAME>
   <DESG>Clerk</DESG>
   <DEPT>SALES</DEPT>
   <SALARY>150</SALARY>
 </EMP>
 <EMP EMPID="E005">
   <ENAME>Richard</ENAME>
   <DESG>Divisional Manager</DESG>
   <DEPT>MARKETING</DEPT>
   <SALARY>375</SALARY>
 </EMP>
</EMPDETAILS>
 
6_UGP_2.xsl
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
 <xsl:for-each select="EMPDETAILS/EMP">
<xsl:choose>
<xsl:when test="SALARY[. &gt; 250]">
 <font color="green" />
<li>
 <xsl:value-of select="ENAME" />
 </li>
 <br />
<li>
 <xsl:value-of select="DESG" />
 </li>
 <br />
<li>
 <xsl:value-of select="DEPT" />
 </li>
 <br />
 <li>
 <xsl:value-of select="SALARY" />
 </li>
 <br />
 </xsl:when>
 <xsl:otherwise>
 <font color="blue" />
 <li>
 <xsl:value-of select="ENAME" />
 </li>
 <br />
 <li>
 <xsl:value-of select="DESG" />
 </li>
 <br />
 <li>
 <xsl:value-of select="DEPT" />
 </li>
 <br />
<li>
 <xsl:value-of select="SALARY" />
 </li>
 <br />
 </xsl:otherwise>
 </xsl:choose>
 </xsl:for-each>
 </xsl:template>
 </xsl:stylesheet>
 
UGP 3.
 
6_UGP_3.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="6_UGP_3.xsl"?>
<EMPDETAILS>
 <EMP>
   <EMPNAME>William Hill</EMPNAME>
   <DOB>1965/3/19</DOB>
   <ADDRESS>13, Cross Street</ADDRESS>
   <DESIG>Manager</DESIG>
 </EMP>
 <EMP>
   <EMPNAME>Peter Hall</EMPNAME>
   <DOB>1945/8/1</DOB>
   <ADDRESS>24, Orange Street</ADDRESS>
   <DESIG>Secretary</DESIG>
 </EMP>
 <EMP>
   <EMPNAME>David Alexander</EMPNAME>
   <DOB>1980/12/24</DOB>
   <ADDRESS>10, Anchor Street</ADDRESS>
   <DESIG>Manager</DESIG>
 </EMP>
</EMPDETAILS>
 
6_UGP_3.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
 <html>
 <body>
 <table border="2" bgcolor="yellow">
   <tr>
    <th>Employee Name</th>
    <th>Date of Birth</th>
    <th>Address</th>
    <th>Designation</th>
   </tr>
   <xsl:for-each select="EMPDETAILS/EMP">
   <tr>
    <td><xsl:value-of select="EMPNAME"/></td>
    <td><xsl:value-of select="DOB"/></td>
    <td><xsl:value-of select="ADDRESS"/></td>
    <td><xsl:value-of select="DESIG"/></td>
   </tr>
   </xsl:for-each>
 </table>
 </body>
 </html></xsl:template></xsl:stylesheet>
 
UGP 4.
6_UGP_4.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="6_UGP_4.xsl"?>
<CUSTDETAILS>
 <CUSTOMER CUSTID="C001">
   <CUSTNAME>William Anderson</CUSTNAME>
   <ADDRESS>13, Cross Street</ADDRESS>
   <CITY>New York</CITY>
   <STATE>New York</STATE>
   <COUNTRY>USA</COUNTRY>
   <PHONE>6785764</PHONE>
 </CUSTOMER>
 <CUSTOMER CUSTID="C002">
   <CUSTNAME>Bill Sanders</CUSTNAME>
   <ADDRESS>13, Crick Street</ADDRESS>
   <CITY>Seattle</CITY>
   <STATE>Washington</STATE>
   <COUNTRY>USA</COUNTRY>
   <PHONE>608475</PHONE>
 </CUSTOMER>
</CUSTDETAILS>
 
6_UGP_4.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
 <html>
 <body>
    <xsl:for-each select="CUSTDETAILS/CUSTOMER">
    <li><xsl:value-of select="@CUSTID"/></li>
    <li><xsl:value-of select="CUSTNAME"/></li>
    <li><xsl:value-of select="ADDRESS"/></li>
    <li><xsl:value-of select="CITY"/></li>
    <li><xsl:value-of select="STATE"/></li>
    <li><xsl:value-of select="COUNTRY"/></li>
    <li><xsl:value-of select="PHONE"/></li>
    <br></br>
    </xsl:for-each>
    </body>
 </html>
</xsl:template>
</xsl:stylesheet>
 
第七课
经验
按照解析器的缺点介绍它的功能, 例如解析器不能单独的从XML文档的一部分遍历到另一部分。然后,介绍文档对象模型是对于这个问题的解决方案。可以到www.W3C.org查阅关于XML DOM的发展的最新信息。
告诉学生IXMLDOMNode,IXMLDOMNodeList,IXMLDOMParseError对象中的“I”代表接口(interface)。这些是各种XML DOM对象所执行的基本接口。
解决方案:稍等一下…
1. CyberShoppe 卖的产品的详细信息存储在XML文档 product.xml 里。编写使用DOM对象显示所有产品价格的代码。
7_JAM_1.htm
<html>
<head>
<script language="JavaScript">
 
function loadXML()
{
var myxmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0")
myxmlDoc.async=false
myxmlDoc.load("products.xml")
var myelement = myxmlDoc.getElementsByTagName("PRICE");
for (i=0; i<= myelement.length -1; ++i)
{
    alert(myelement.item(i).text)
}
}
</script>
</head>
<body onLoad="loadXML()">
</body>    
</html>
 
products.xml
<?xml version="1.0"?>
<PRODUCTDATA>
 <PRODUCT>
 <PRODUCTNAME>Barbie Doll</PRODUCTNAME>
 <DESCRIPTION>This is a doll for children aged 11 and above</DESCRIPTION>
 <PRICE>10</PRICE>
 <QUANTITY>12</QUANTITY>
 </PRODUCT>
 <PRODUCT>
 <PRODUCTNAME>Mini Bus</PRODUCTNAME>
 <DESCRIPTION>This is a toy for children aged 11 and above</DESCRIPTION>
 <PRICE>20</PRICE>
 <QUANTITY>12</QUANTITY>
 </PRODUCT>
</PRODUCTDATA>
 
 
要执行这个脚本,在浏览器中打开网页7_JAM_1.htm。该页面一被载入浏览器,就显示出显示产品信息的信息框。注意函数getElementsByTagName的作用是找到所有称为PRICE的元素的值。然后,你可以使用for循环遍历getElementsByTagName()函数所返回的节点集来显示这些值。
第八课
经验
你可以通过给出关于在上一课讨论的各种DOM对象的简要概述来开始这一课的教学。保证学生理解和这四个对象相关联的主要方法和属性。
然后你可以说明这课提到的情景。这可以在解释使用样式表文档处理XML文档需要使用的对象了以后再说明。
首先,建立XML和XSD文档。然后,讨论处理XML和XSD文档需要的代码。还可以建立为最终用户显示信息所需的HTML文档。最后,说明必须用来连接各种HTML和XML文档的JavaScript代码。
 
例子和类比
你可以比较DOM和链表的使用。首先,解释链表的不同部分和遍历链表的机制。然后,比较遍历链表的方法和遍历DOM节点树的方法有什么不同。
补充内容
把XSLT样式表应用于XML文档的一个方法是使用IXSLProcessor和XSLTemplate对象。这些对象提供对使用高速缓冲存储器的样式表的支持以及对载入XML文档异步模式的支持。另一个把XSLT样式表应用于XML文档的简单方法是使用DOMDocument对象的transformNode()方法,如下例所示:
<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
function LOADXML()
{
 var xmldoc=new ActiveXObject("Msxml2.DOMDocument.4.0");
 xmldoc.async=false;
 xmldoc.load("product.xml");
 var xsldoc=new ActiveXObject("Msxml2.DOMDocument.4.0");
 xsldoc.async=false;
 xsldoc.load("productlist.xsl");
 x.innerHTML = xmldoc.transformNode(xsldoc);
}
</SCRIPT>
</HEAD>
<BODY οnlοad="LOADXML()">
<div id="x">
</div>
</BODY>
</HTML>
上面的代码建立了两个DOMDocument对象的实例,一个来载入XML文档,另一个来载入XSLT样式表。然后它调用包含该XML文档的DOMDocument对象的方法transformNode()。并将对包含XSLT样式表的那个DOMDocument对象的引用作为参数传递给该方法。方法transformNode()通过应用浏览器窗口里显示的样式表把XML文档转换成特定格式。这是另一个动态地把XSLT样式表作用于XML文档的简单方法。但是,transformNode()方法是Microsoft对W3C DOM的扩展。
常见问题
1. Msxml2.FreeThreadedDOMDocument 代表什么?
Msxml2.FreeThreadedDOMDocument 用来建立一个自由线程对象。有两种线程模式,租用线程和自由线程。租用线程模式让所有的对象都再同一个线程上进行单线程存取。自由线程允许多线程存取。在这种模式中,对象可以在任何时候任何线程上执行。
2. 什么是高速缓冲存储器?
高速缓冲存储器是计算机内存的一部分。它由高速静态随机存取存储器(Static Random Access Memory ,简记为SRAM)组成。访问存储在高速缓冲存储器里的信息比访问RAM其他部分的信息要快。
3. 有转换一个单个节点的方法吗?
是的,有。可以使用XMLDOMNode对象的transformNode()方法来转换包含在一个节点和它的所有子节点中的信息。
解决方案:稍等一下…
1.       编写把XML 模式“products.xsd”添加到 模式 集合中的代码。
解决方案:
var xsdschemacache = new ActiveXObject("Msxml2.XMLSchemaCache.4.0");
var xmlDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0");
xmlDoc.validateOnParse=true
xmlDoc.load("products.xml");
var namespace=xmlDoc.namespaceURI;
xsdschemacache.add(namespace,"products.xsd");
2.下面的JavaScript代码是建立XSLTemplate 对象和DOMDocument 对象的。如果有错,请把其中的错误找出来。
custss = new activexObject(MSXML.XSLTemplate.4)
custdomdoc = activexobject( "MSXML.ThreadedDOMdocument.4.0);
解决方案:
custss= new ActiveXObject("MSXML2.XSLTemplate.4.0");
custdomdoc = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.4.0");
 

3.找出下面JavaScript 代码中的错误:
xslProcObject.output=xmlDocObject;
xslProcObject.Transform
alert("xslProcObject");
解决方案:
xslProcObject.input=xmlDocObject;
xslProcObject.transform();
alert(xslProcObject.output);
 
解决方案:有指导实践
8.P.1
 
包含书的详细信息的XML文档如下:
8_P_1.xml
<?xml version="1.0"?>
<BOOKDETAILS>
   <BOOK BOOKID="B001">
      <TITLE> MORNING, NOON, AND NIGHT </TITLE>
      <AFNAME> SYDNEY </AFNAME>
      <ALNAME> SHELDON </ALNAME>
      <PRICE> 10 </PRICE>
      <QUANTITY> 100 </QUANTITY>
   </BOOK>
   <BOOK>
      <TITLE> THE CLIENT </TITLE>
      <AFNAME> JOHN </AFNAME>
      <ALNAME> GRISHAM </ALNAME>
      <PRICE> 20 </PRICE>
      <QUANTITY> 250 </QUANTITY>
   </BOOK>
   <BOOK>
      <TITLE> A STRANGER IN THE MIRROR </TITLE>
      <AFNAME> SYDNEY </AFNAME>
      <ALNAME> SHELDON </ALNAME>
      <PRICE> 15 </PRICE>
      <QUANTITY> 120 </QUANTITY>
   </BOOK>
</BOOKDETAILS>
 
你可以使用下面的样式表把上面的数据以表格形式显示出来:
8_P_1_a.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<table border="2">
<thead>
 <th> TITLE </th>
 <th> AUTHOR </th>
 <th> PRICE </th>
 <th> QUANTITY </th>
</thead><tbody>
<xsl:for-each select="BOOKDETAILS/BOOK">
<tr>
<td><xsl:value-of select="TITLE"/> </td>
<td> <xsl:value-of select="AFNAME"/>
<xsl:text> </xsl:text>
<xsl:value-of select="ALNAME"/>
</td>
<td><xsl:value-of select="PRICE" /></td>
<td><xsl:value-of select="QUANTITY" /> </td>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
在上面的代码中,xsl:text元素用来在作者的名和姓之间添加一个空格。
要以列表形式显示相同的书的详细信息,你可以使用下面的样式表:
8_P_1_b.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:for-each select="BOOKDETAILS/BOOK">
<li>
TITLE: <xsl:value-of select="TITLE"/><br />
AUTHOR: <xsl:value-of select="AFNAME"/> <xsl:text> </xsl:text> <xsl:value-of select="ALNAME"/> <br/>
PRICE: <xsl:value-of select="PRICE" /><br/>
QUANTITY: <xsl:value-of select="QUANTITY" /> <br/>
</li>
<hr />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
为了接收用户对查看形式的选择,需要建立一个包含框架的网页。左边的框架显示接收用户输入的控件,右面的框架来显示结果。你可以使用下面的代码建立空白页:
right.htm
<html>
<head>
<title>Untitled Document</title>
</head>
<body bgcolor="#FFFFFF">
<div id="x">
</div>
</body>
</html>
上面代码中的 div 块将将用来显示包含书的详细信息的列表或表格。
你可以使用下面的代码来接收用户的选择:
left.htm
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="javascript">
var xmlDoc
function loadXML()
{
xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
xmlDoc.async = false;
xmlDoc.load("8_P_1.xml");
}
 
function ApplyXSL()
{
var xslt = new ActiveXObject("Msxml2.XSLTemplate.4.0");
var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0");
var xslProc;
xslDoc.async = false;
alert (stylesheet.value);
xslDoc.load(stylesheet.value);
xslt.stylesheet = xslDoc;
xslProc = xslt.createProcessor();
xslProc.input = xmlDoc;
xslProc.transform();
parent.right.x.innerHTML=xslProc.output;
}
 
</script>
 
</head>
<body bgcolor="#FFFFFF" onLoad="loadXML()">
<select name="stylesheet" onChange="ApplyXSL()">
              <option value="8_P_1_a.xsl"> View Book Details in a Table </option>
              <option value="8_P_1_b.xsl"> View Book Details in a List </option>
</select>
</body>
</html>
 
上面的代码将显示一个下拉列表框来接收用户的选择。网页一旦被载入,就调用loadXML函数。该函数把XML文档载入DOMDocument对象。在用户选择了下拉列表框中的一个选项以后,SELECT元素的onchange事件被触发,并调用ApplyXSL函数。该函数只是简单地把相应的样式表应用于XML文档。
最后,你需要建立主页,该主页将用来显示left.htm和right.htm。
<HTML>
   <HEAD>
      <TITLE>XML/XSL Viewer Demo</TITLE>
   </HEAD>
   <FRAMESET COLS="200,*" FRAMEBORDER="0" BORDER="no"    FRAMESPACING="0">
      <FRAME ID="left" SRC="left.htm" SCROLLING="no">
      <FRAME ID="right" SRC="right.htm">
   </FRAMESET>
</HTML>
通过在浏览器中打开 index.htm,在下拉列表框中选择一个选项来执行完整的代码。

 
解决方案:独立实践
UGP 1.
 
该文件接收 XML 文件的名字。它提供一个文本框和 submit 超链接。通过点击该链接, javascript 载入 XML 文档。如果 XML 文件是格式良好的, javascript 函数就选出结点名是 CUSTOMERNAME 的元素。然后函数循环结果返回的节点集,如果附在元素上的文本是“ Harold Johnson ”,函数选出 ADDRESS 和 PHONENUMBER 元素,置相应的值,并在消息框中显示输出结果。
 
XMLDisplayString.htm
<html>
<head>
<title>XML</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
   <form name="frmXMLFileName" method="post" action="">
    <table width="60%" border="0">
      <tr>
<td width="60%"><font size="2">Enter the XML FileName Here
</font></td>
</tr>
<tr>
<td width="24%">
   <input type="text" name="TxtName">
</td>
</tr>
<tr>
   <td width="41%"><font size="2"">   serif">
   <a href="#"    οnclick="javascript:cmdSubmit_click()">Submit</a></font></td>
</tr>
</table>
</form>
<p align="left">&nbsp;</p>
 
<script Language="javascript">
function cmdSubmit_click()
{
   var objelements;
 
   if (frmXMLFileName.TxtName.value.length==0)
   {
       alert ("Invalid XML String");
   }
   else
   {
       var xmldoc= new ActiveXObject("Msxml2.DOMDocument.4.0");           xmldoc.load(frmXMLFileName.TxtName.value);
       var error=xmldoc.parseError;      
       if(error!="")
       {
          alert("Error");
       }
       else
       {
       objelements=xmldoc.getElementsByTagName("CUSTOMERNAME");       for(ctr=0;ctr<=objelements.length;ctr++)
       {
          if (objelements[ctr].text=="Harold Johnson")
          {
           objelements=xmldoc.getElementsByTagName("ADRESS");
              objelements[ctr].text="94, McFarlane                Avenue";
                  objelements=xmldoc.getElementsByTagName("PHONE");
              objelements[ctr].text="412-233-2344";              
              alert(xmldoc.xml);
              break;
          }
       }
       }
   }
}
</script>
</body>
</html>
 
Customer.xml
<?xml version="1.0"?>
<CUSTOMER>
<CUSTOMERNAME>Harold Johnson</CUSTOMERNAME>
<ADDRESS>56, Regent Road</ADDRESS>
<CITY>London</CITY>
<COUNTRY>UK</COUNTRY>
<PHONE>444-425-2355</PHONE>
</CUSTOMER>
 
 
UGP 2.
 
该文件接收 XML 文件的名称。它提供一个文本框和 submit 链接。通过点击该链接,使用 DOM 和 javascript 载入 XML 文档。如果该 XML 文件是格式良好的, JavaScript 函数就使用 childNode 函数循环 XML 文档中的整个节点集,并使用 DOMDocument 类的 nodeName 、 nodeType 和 nodeValue 属性在信息框里显示输出结果。
 
XMLDisplayString.htm
<html>
<head>
<title>XML</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
 
<body bgcolor="#FFFFFF">
<form name="frmXMLFileName" method="post" action="">
 <table width="60%" border="0">
    <tr>
     <td width="60%"><font     size="2">Enter the XML  FileName Here
      </font></td>
 </tr>
 <tr>
       <td width="24%">
    <input type="text" name="TxtName">
       </td>
    </tr>
 <tr>
       <td width="41%"><font size="2"">   sans-serif"><a href="#"      οnclick="javascript:cmdSubmit_click()">Submit</a></font></td>
    </tr>
 </table>
</form>
<p align="left">&nbsp;</p>
<script Language="javascript">
function cmdSubmit_click()
{
var objelements;
if (frmXMLFileName.TxtName.value.length==0)
{
    alert ("Invalid XML String");
}
else
{
    var xmldoc= new ActiveXObject("Msxml2.DOMDocument.4.0");    xmldoc.load(frmXMLFileName.TxtName.value);
   
    var error=xmldoc.parseError;      
    if(error!="")
    {
        alert("Error");
    }
    else
    {
        for(ctr=1;ctr<xmldoc.childNodes.length;ctr++)
        {         
                  alert("Node Name: " +                  xmldoc.childNodes[ctr].nodeName);
                      alert("Node Type: " + xmldoc.childNodes[ctr].nodeTypeString);
          
           var objparentnode=xmldoc.childNodes[ctr];
               for(ctr1=0;ctr1<objparentnode.childNodes.length;ctr1++)
           {
                             alert("Node Name: " +            objparentnode.childNodes[ctr1].nodeName);
 
                             alert("Node Type: " + objparentnode.childNodes[ctr1].nodeTypeString);
                             var objchildnode = objparentnode.childNodes[ctr1];          
             for(ctr2=0;ctr2<objchildnode.childNodes.length;ctr2++)
               {
                            alert("Node Value: " + objchildnode.childNodes[ctr2].nodeValue);
 
               }
           }
        }
    }
}
}
</script>
</body>
</html>
 
 
movie.xml
<?xml version="1.0"?>
<MOVIE>
<MOVIEID>M920</MOVIEID>
<MOVIENAME>The Last Emperor</MOVIENAME>
<CAST>John Lone</CAST>
<DIRECTOR>Bernado Bertolucci</DIRECTOR>
<YEAROFRELEASE>1987</YEAROFRELEASE>
<CATEGORY>Drama</CATEGORY>
</MOVIE>
 
UGP 3.
 
载入 emp.xml 文件,并把 empss.xsl 应用于该 XML 文档的正确代码如下:
<html>
<script language="javascript">
var empt = new ActiveXObject("Msxml2.XSLTemplate.4.0");
var emptdoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0");
var empproc;
emptdoc.async = false;
emptdoc.load("empss.xsl");
empt.stylesheet = emptdoc;
var empxml = new ActiveXObject("Msxml2.DOMDocument.4.0");
empxml.async = false;
empxml.load("emp.xml");
empproc = empt.createProcessor();
empproc.input = empxml;
empproc.transform();
alert(empproc.output);
</script>
</html>
 
第九课
经验
通过讨论支持XML的MS SQL Server 2000的特征来开始这一课的教学。告诉学生大部分SQL Server's的新的XML整合特性是SQL Server 2000的基本功能的一部分,其他的是SQL Server 2000 Web版的XML部分的附件。你可以在http://msdn.microsoft.com/downloads/default.asp找到它们。
在介绍FOR XML子句的语法之前介绍它的用途。需要详细的讲述不同的模式、AUTO、RAW和EXPLICIT。让学生检查XML文档的形式良好性。说明URL查询的语法。为了更好的理解,可以给学生们一个现场的演示。在开始演示以前,要保证PRODUCTS表里有数据。
需要陈述URL和XPath查询之间的区别。你必须告诉学生在XPath查询里需要使用模式。确保你为模式类型在IIS里建立了虚拟目录。注意,模式里的表和字段都是对大小写敏感的。
一些OPENXML调用可用来提供XML文档各部分的行集视图并能处理它们,例如把它们插入不同的表中。例如,你可以把一个XML文档拆分开,使用两个INSERT语句把文档里的一部分数据存储在一个表中,把其余的数据存储在另一个表中。
在讨论sp_xml_preparedocumen时,告诉学生使用sp_xml_preparedocumen删除内存中的内部文档是一个很好的习惯。
常见问题
1.     我可以指定哪些字段映射成元素,哪些映射成属性吗?
可以。可以使用SQL查询的EXPLICIT模式或建立XDR 模式并映射每个你需要的字段。例如,如果你把PRODID映射成属性,其余的字段映射成元素。你可以在XDR 模式里建立相应的属性类型和元素类型。然后,你可以用下面给出的语句查看XML文档:
在上面的语句中,PRODUCTS是虚拟目录的名字,它映射到SQL Server数据库, products.xml是包含把各种字段映射到元素和属性的模式定义的文件名称。

 
补充内容
使用EXPLICIT模式
你可以给出一个使用EXPLICIT查询的例子,如下:
SELECT 1 as Tag,
NULL as parent,
products.PRODUCTID as [products!1!PRODUCTID],
products.NAME as [products!1!NAME]
from products
在上面的查询中,首先,目标个数指定为1,父节点指定为NULL表示这个目标没有父节点。然后,你指定字段名和它们被转换的方式。这是以如下格式指定的:
Elementname!Tagnumber!AttributeName
因此,当你给出表达式[products!1!PRODUCTID]时,目标的名字是products,目标的个数是1,PRODUCTID是属性。该查询将返回如下的输出结果:
<products PRODUCTID=“P001” NAME=“Barbie Doll”/>
<products PRODUCTID=“P002” NAME=“Mini Bus”/>
在URL查询中使用XSL样式表
你可以使用XSL样式表对URL查询返回的数据进行格式化。例如,你可以建立一个如下的样式表:
<xsl:stylesheet xmlns:xsl=“http://www.w3.org/TR/WD-xsl”>
<xsl:template match=“/”
<li>
<xsl:apply-templates/>
</li>
</xsl:template>
</xsl:stylesheet>
注意在上面的样式表中,使用命名空间“http://www.w3.org/TR/WD-xsl”代替了“http://www.w3.org/1999/XSL/Transform”。这是因为SQL Server 2000不支持新的XSLT规范。它只支持旧的规范。因此,你不用使用XSLT的一些新的元素,例如sort。把该文件存为 example.xsl
现在,你可以直接用下面的URL查询把上面的样式表应用于一个XML文档:
http://localhost/EMPLOYEES?sql=SELECT+*+FROM+EMPLOYEES FOR XML AUTO&root=root&xsl=example.xsl

使用XDR Schema把字段映射成元素
使用XDR 模式,你可以把表中的字段映射成XML文档中的元素。如下:
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<AttributeType name="PRODUCTID"/>
<ElementType name="PRODUCTNAME"/>
<ElementType name="DESCRIPTION"/>
<ElementType name="CATEGORY"/>
<ElementType name="PRICE"/>
<ElementType name="QOH"/>
<ElementType name="PRODUCTS" sql:relation="PRODUCTS">
<attribute type="PRODUCTID" sql:field="PRODUCTID"/>
<element type="PRODUCTNAME" sql:field="PRODUCTNAME"/>
<element type="DESCRIPTION" sql:field="DESCRIPTION"/>
<element type="CATEGORY" sql:field="CATEGORY"/>
<element type="PRICE" sql:field="PRICE"/>
<element type="QOH" sql:field="QOH"/>
</ElementType>
</Schema>
在上面的模式中,PRODUCTS表中的所有字段都被映射成元素。只有PRODUCTID被映射成PRODUCTS元素的一个属性。现在,你可以用给出的XPath查询选出玩具的详细信息。如下:
http://localhost/PRODUCTS/schema/product.xml/PRODUCTS[CATEGORY="TOY"]?root=root
注意,因为CATEGORY是一个元素,在它前面没有‘@’符号。
解决方案:稍等一下…
1.可以使用FOR XML 子句的三种模式类型是什么?
解决方案:
可以使用FOR XML 子句的三种模式类型是AUTO,RAW,EXPLICIT。
2. books 表包含CyberShoppe 卖的书的详细信息。编写一个查询生成基于存储在 books表里的数据的XML文档。还要保证表中的所有字段都被显示成元素而不是属性。
解决方案:
http://localhost/PRODUCTS?sql=SELECT+*+FROM+BOOKS+FOR+XML+AUTO,ELEMENTS&root=root
 

3.找出下面URL查询里的错误:Identify the error in the following URL query:
http://localhost/EMPLOYEES?sql=SELECT+*+FROM+EMPLOYEES FOR XML AUTO&root=root
解决方案:
在查询语句中的所有空格都要用+号代替。该查询应如下所示:
http://localhost/EMPLOYEES?sql=SELECT+*+FROM+EMPLOYEES+FOR+XML+AUTO&root=root
4. CyberShoppe 卖的书分成各种大类,如科学,小说,传记。这些书的详细信息存储在SQL Server 2000数据库里。建立一个XPath查询来显示所有小说的详细信息。还要建立一个执行该查询所需的模式 。
解决方案:
显示书的详细信息的模式如下所示:
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">
 
<ElementType name="BOOKS" sql:relation="BOOKS">
<AttributeType name="BOOKID"/>
<AttributeType name="TITLE"/>
<AttributeType name="AUFNAME"/>
<AttributeType name="AULNAME"/>
<AttributeType name="PRICE"/>
<AttributeType name="CATEGORY"/>
 
<attribute type="BOOKID" sql:field="BOOKID"/>
<attribute type="TITLE" sql:field="TITLE"/>
<attribute type="AUFNAME" sql:field="AUFNAME"/>
<attribute type="AULNAME" sql:field="AULNAME"/>
<attribute type="PRICE" sql:field="PRICE"/>
<attribute type="CATEGORY" sql:field="CATEGORY"/>
</ElementType></Schema>
把上面的文件在c:/inetpub/wwwroot/PRODUCTS/schema文件夹下存为 books.xml。在浏览器里执行下面的的查询以返回书的类型是小说的结果。
http://localhost/PRODUCTS/schema/books.xml/BOOKS[@CATEGORY="FICTION"]?root=root
5.可以使用OPENXML 函数的系统存储过程是什么?
解决方案:
sp_xml_preparedocument 和sp_xml_removedocument是可以使用OPENXML 函数的系统存储过程。
第十课
经验
你可以通过简单说明超链接和超链接如何使用来开始这一课。你还可以讨论在World Wide Web的流行中,超链接扮演的角色。简要说明HTML的局限性,然后介绍Xlink是解决这些问题的方法。例如,用户点击一个链接,你可能需要在三个框架里同时显示三个文档。如果你要在HTML里做到这点,就需要编写代码。还要告诉学生因为这两种技术处于工作起草阶段,所以很难找到实际的实现。但是,本课程里有这个章节是为了提供和XML相关的技术的一些基础知识和了解。
解决方案:稍等一下…
1.下面元素中哪个不可以显示成链接?
a)        Buttons
b)        Text
c)        Menu Items
d)        List Items
解决方案:
c)        Menu Items
 
2.下面哪个是扩展链接类型?
a)        In-line link
b)        Straight-line link
c)        Out-of-line link
d)        One-line link
解决方案:
c)       Out-of-line links
解决方案:独立实践
UGP 1.
在浏览器地址框里输入下面的URL查询:
http://localserver/TICKET?sql=SELECT+*+FROM+TRAIN_TICKET+FOR+XML+AUTO&root=root
 

UGP 2.
输入下面的代码,把它存成文件 ticket.xml
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">
 
<ElementType name="TRAIN_TICKET" sql:relation="TRAIN_TICKET">
   <AttributeType name="PASSENGERNAME" />
   <AttributeType name="AGE" />
   <AttributeType name="SOURCE" />
   <AttributeType name="DESTINATION" />
   <AttributeType name="DATEOFTRAVEL" />   
   <AttributeType name="CLASS" />
   <AttributeType name="FARE" />  
   <AttributeType name="STATUS" />
 
 
   <attribute type="PASSENGERNAME" sql:field="PASSENGERNAME"/>
   <attribute type="AGE" sql:field="AGE" />
   <attribute type="SOURCE" sql:field="SOURCE"/>
 <attribute type="DESTINATION" sql:field="DESTINATION"/>
   <attribute type="DATEOFTRAVEL" sql:field="DATEOFTRAVEL"/>
   <attribute type="CLASS" sql:field="CLASS"/>
   <attribute type="FARE" sql:field="FARE"/>
   <attribute type="STATUS" sql:field="STATUS"/>
</ElementType>
</Schema>
把这个XML文件保存在C:/inetpub/wwwroot/PRODUCTS/schema下。
XPath查询的代码必须如下所示:
http://localhost/PRODUCTS/schema/ticket.xml/TRAIN_TICKET[@STATUS="Confirmed"]?root=root
UGP 3.
 
建立下面的样式表来对SQL Server 2000的表 tickets里选出的数据进行格式化。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
 <html>
 <body>
    <table border="2" bgcolor="pink">
      <tr>
        <th>PASSENGER NAME</th>
        <th> SOURCE </th>
        <th>DESTINATION</th>
     <th> STATUS </th>
    <th> FARE </th>
    <th>DATE OF JOURNEY</th>
    <th>CLASS</th>
       </tr>
      <xsl:for-each select="root/TRAIN_TICKET">
      <tr>
        <td><xsl:value-of select="PASSENGERNAME"/></td>
        <td><xsl:value-of select="SOURCE "/></td>
<td><xsl:value-of select="DESTINATION"/></td>
<td><xsl:value-of select="STATUS"/></td>
<td><xsl:value-of select="FARE"/></td>
<td><xsl:value-of select="DATEOFTRAVEL"/></td>
        <td><xsl:value-of select="CLASS"/></td>
</tr>
      </xsl:for-each>
    </table>
 </body>
 </html>
</xsl:template></xsl:stylesheet>
把上面的文件以文件名 tickets.xsl保存在c:/inetpub/wwwroot/PRODUCTS folder下。
现在,你可以用下面给出的URL查询在浏览器里以自定义的格式显示车票的详细信息:
http://localhost/PRODUCTS?sql=SELECT+*+FROM+TRAIN_TICKET+FOR+XML+AUTO,+ELELEMENTS&root=root&xsl=tickets.xsl
如果上面的语句不用工作,试着不用XSL选项执行URL查询。检查查询生成的标签并把它们映射到样式表。样式表应该找得到结果元素的值。因此,查询生成的元素和属性必须和样式表里使用的哪些元素和属性相一致。
UGP 4.
 
DECLARE @doc varchar(1000)
DECLARE @idoc int
SET @doc = '<ROOT>
<TICKET>
 <PASSENGERNAME> TOM WILKINS </PASSENGERNAME>
   <AGE> 20 </AGE>
   <SOURCE> CHICAGO </SOURCE>
   <DESTINATION> MIAMI </DESTINATION>
   <DATEOFTRAVEL> 2001-09-10 </DATEOFTRAVEL>
   <CLASS> FIRST CLASS </CLASS>
   <FARE> 200 </FARE>
   <STATUS> Confirmed </STATUS>
     </TICKET>
</ROOT>'
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT *
FROM OPENXML (@idoc, '/ROOT/TICKET', 1)
WITH (PASSENGERNAME varchar(30),
    AGE int,
    SOURCE CHAR(20),
    DESTINATION char(20),
    DATEOFTRAVEL datetime,
    CLASS char(20),
    FARE money,
    STATUS char(20)
)
INSERT TICKET
SELECT *
FROM OPENXML(@idoc, '/ROOT/TICKET')
WITH TICKET
EXEC sp_xml_removedocument @idoc

解决方案:补充练习
1.      
可以使用三个文件:两个 .xsd 文件和一个 .xml 文件来解决给出的问题。
给出的情景需要的文件如下:
a. commonschema.xsd – 该 xsd 文件保存解决方案里所有可重用的组件的 模式 。
b. casehistory.xsd – 该 xsd 文件使用 commonschema.xsd 来定义 casehistory.xml 的 模式 。
c. casehistory.xml – 该 xml 文件以 ID 为“ C001 ” 的 CASEHISTORY 为根元素。 xml 文件里的信息分成两部分, PERSONALINFORMATION 和 CASEINFORMATION 。 PERSONALINFORMATION 里储存 NAME , ADDRESS , GENDER , AGE ,病人的 EXISTINGDISEASES 。 CASEINFORMATION 在元素 VISITINFORMATION 里储存病人每次到医院的情况。 VISITINFORMATION 里有 DATE , DOCTOR , COMPLAIN , DIAGNOSIS , PRESCRIPTION , NEXTDATEOFVISIT 。
上面所有的文件都使用相同的命名空间,因此包含的元素要包含在 commonschema.xsd 和 casehistory.xsd 的定义里。使用 XML 模式验证器验证这些 xml 文件对于它的模式的正确性。
Casehistory.xml
<?xml version="1.0"?>
<pat1:CASEHISTORY xmlns:pat1="http://www.Getwellsoon.com/patient" CASESHEETID="C001">
 <PERSONALINFORMATION>
      <NAME>John Watson</NAME>
      <ADDRESS>
      <HOUSENUMBER>24</HOUSENUMBER>
         <STREET>Wellington Road</STREET>
         <CITY>Seattle</CITY>
         <STATE>Washington</STATE>
         <ZIP>55555</ZIP>
      </ADDRESS>
      <GENDER>MALE</GENDER>
      <AGE>10</AGE>
      <EXISTINGDISEASES>Diabetes</EXISTINGDISEASES>
 </PERSONALINFORMATION>
 <CASEINFORMATION>
      <VISITINFORMATION>
         <DATE>2001-03-29</DATE>
         <DOCTOR>Diane</DOCTOR>
         <COMPLAIN>Injury to the left knee caused heavy bleeding</COMPLAIN>
         <DIAGNOSIS>hematoma in left knee</DIAGNOSIS>
         <PRESCRIPTION>bed rest and change dressing twice a week</PRESCRIPTION>
         <NEXTDATEOFVISIT>2001-04-07</NEXTDATEOFVISIT>
      </VISITINFORMATION>
      <VISITINFORMATION>
         <DATE>2001-04-07</DATE>
         <DOCTOR>Diane</DOCTOR>
         <COMPLAIN>Injury to the left knee caused heavy bleeding</COMPLAIN>
         <DIAGNOSIS>hematoma in left knee</DIAGNOSIS>
         <PRESCRIPTION>bed rest and change dressing twice a week</PRESCRIPTION>
         <NEXTDATEOFVISIT>2001-04-14</NEXTDATEOFVISIT>
      </VISITINFORMATION>
 </CASEINFORMATION>
</pat1:CASEHISTORY>
 
Casehistory.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.Getwellsoon.com/patient"   xmlns:pat="http://www.Getwellsoon.com/patient">
 <include schemaLocation="commoninfo.xsd"/>
 <element name="CASEHISTORY">
      <complexType>
      <sequence>
      <element   name="PERSONALINFORMATION"    type="pat:dtpersonaldata"/>
                   <element   name="CASEINFORMATION"    type="pat:dtcasedata"/>
         </sequence>  
      <attribute name="CASESHEETID" type="pat:dtcasesheetid"/>
      </complexType>
 </element>
 <complexType name="dtpersonaldata">
      <sequence>
         <element   name="NAME" type="string"/>
         <element   name="ADDRESS" type="pat:dtaddress"/>
         <element   name="GENDER" type="pat:dtgender"/>
                        <element   name="AGE"   type="positiveInteger"/>
         <element   name="EXISTINGDISEASES"   type="string"/>
      </sequence>
 </complexType>
 <complexType name="dtcasedata">
      <sequence>
      <element   name="VISITINFORMATION" type="pat:dtdateofvisit" maxOccurs="unbounded"/>
      </sequence>
 </complexType>
 <complexType name="dtdateofvisit">
      <sequence>
         <element   name="DATE" type="date"/>
         <element   name="DOCTOR" type="string"/>
         <element   name="COMPLAIN" type="string"/>
         <element   name="DIAGNOSIS" type="string"/>
         <element   name="PRESCRIPTION" type="string"/>
         <element   name="NEXTDATEOFVISIT" type="date"/>
               </sequence>
 </complexType>
</schema>
 
 

 

Commoninfo.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.Getwellsoon.com/patient"   xmlns:pat="http://www.Getwellsoon.com/patient">
   <simpleType name="dtcasesheetid">
      <restriction base="string">
          <pattern value="[C]/d{3}"/>
      </restriction>
   </simpleType>
   <complexType name="dtaddress">
      <sequence>
          <element name="HOUSENUMBER"   type="string"/>
          <element name="STREET" type="string"/>
          <element name="CITY"   type="string"/>
          <element name="STATE" type="string"/>
          <element name="ZIP"    type="decimal"/>
                 </sequence>
   </complexType>
   <simpleType name="dtgender">
      <restriction base="string">
          <pattern value="(MALE|FEMALE)"/>
      </restriction>
   </simpleType>
</schema>
 
 
2.      
解决给出情景的问题可以用两个文件完成。一个 xsd 文件,一个 xml 文件。
这些文件是:
a. casehistory.xsl – 该 xsl 文件保存显示 xml 文件的转化信息。
b. casehistory.xml – 该 xml 文件以 ID 为“ C001 ”的 CASEHISTORY 为根元素。 xml 文件里的信息分成两个元素 - PERSONALINFORMATION 和 CASEINFORMATION 。 PERSONALINFORMATION 储存 NAME , ADDRESS , GENDER , AGE , EXISTINGDISEASES 。 CASEINFORMATION 在元素 VISITINFORMATION 里储存病人每次到医院的情况。 VISITINFORMATION 里有 DATE , DOCTOR , COMPLAIN , DIAGNOSIS , PRESCRIPTION , NEXTDATEOFVISIT 。
xsl 文件以列表形式显示病人的个人信息,以表格形式显示病例相关的信息。病人的每次就诊都同所有的病人就诊信息一起按行显示。
 
Casehistory.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="casehistory.xsl"?>
<CASEHISTORY CASESHEETID="C001">
   <PERSONALINFORMATION>
     <NAME>John Watson</NAME>
     <ADDRESS>
         <HOUSENUMBER>24</HOUSENUMBER>
         <STREET>Wellington Road</STREET>
         <CITY>Seattle</CITY>
         <STATE>Washington</STATE>
         <ZIP>55555</ZIP>
     </ADDRESS>
     <GENDER>MALE</GENDER>
     <AGE>10</AGE>
     <EXISTINGDISEASES>Diabetes</EXISTINGDISEASES>
 </PERSONALINFORMATION>
 <CASEINFORMATION>
     <VISITINFORMATION>
         <DATE>2001-03-29</DATE>
         <DOCTOR>Diane</DOCTOR>
         <COMPLAIN>Injury to the left knee caused heavy bleeding</COMPLAIN>
         <DIAGNOSIS>hematoma in left knee</DIAGNOSIS>
         <PRESCRIPTION>bed rest and change dressing twice a week</PRESCRIPTION>
         <NEXTDATEOFVISIT>2001-04-07</NEXTDATEOFVISIT>
     </VISITINFORMATION>
             <VISITINFORMATION>
         <DATE>2001-04-07</DATE>
         <DOCTOR>Diane</DOCTOR>
         <COMPLAIN>Injury to the left knee caused heavy bleeding</COMPLAIN>
         <DIAGNOSIS>hematoma in left knee</DIAGNOSIS>
         <PRESCRIPTION>bed rest and change dressing twice a week</PRESCRIPTION>
         <NEXTDATEOFVISIT>2001-04-14</NEXTDATEOFVISIT>
     </VISITINFORMATION>
 </CASEINFORMATION>
</CASEHISTORY>
 
casehistory.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
 <xsl:apply-templates/>
</xsl:template>
<xsl:template match="/">
 <xsl:apply-templates />,
</xsl:template>
<xsl:template match="text()">
 <xsl:value-of select="."/>
</xsl:template>
<xsl:template match="EXISTINGDISEASES">
<xsl:if test="position()=last()”>
.
</xsl:if>
</xsl:template>
<xsl:template match="/">
<HTML>
 <HEAD>
      <TITLE>Patient Information System</TITLE>
      </HEAD>
 <BODY>
 <H1>Case History</H1>          
      <xsl:for-each select="CASEHISTORY/PERSONALINFORMATION">             
      <B>Name:</B> <xsl:value-of select="NAME"/><br/>     
         <B>Address:</B><br/>
         HouseNumber: <xsl:value-of select="ADDRESS/HOUSENUMBER" /><br/>
  Street:<xsl:value-of select="ADDRESS/STREET" /><br/>
  City:<xsl:value-of select="ADDRESS/CITY" /><br/>
 State:<xsl:value-of select="ADDRESS/STATE" /><br/>
  Zip:<xsl:value-of select="ADDRESS/ZIP" /><br/>            
 <B>Gender: </B><xsl:value-of select="GENDER" /><br/>                    <B>Age:</B> <xsl:value-of select="AGE" /><br/>
      <B>Existing Diseases:</B> <xsl:apply-templates select="EXISTINGDISEASES" />            
                   </xsl:for-each>         
         <p/>
      <table border ="2">
      <tr>
 <td>
      <b>Date</b>
      </td>
      <td><b>Doctor</b></td>
      <td><b>Complain</b></td>
      <td><b>Diagnosis</b></td>
      <td><b>Prescription</b></td>
 <td><b>Next Date of Visit</b></td>
      </tr>
      <xsl:for-each select="CASEHISTORY/CASEINFORMATION/VISITINFORMATION">
      <tr>
      <td>
      <xsl:value-of select="DATE"/>
      </td>
      <td>
      <xsl:value-of select="DOCTOR"/>
      </td>
      <td><xsl:value-of select="COMPLAIN"/></td>
      <td><xsl:value-of select="DIAGNOSIS"/></td>
      <td><xsl:value-of select="PRESCRIPTION"/></td>
      <td><xsl:value-of select="NEXTDATEOFVISIT"/></td>        </tr>
 </xsl:for-each>
 </table>
 </BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
 
3.
可以使用 xmldisplay.htm文件解决给出的问题。该html文件显示包含一个文本框和一个超链接的窗体。文本框接收xml文件的名字,点击链接会调用函数cmdsubmit_click。
该函数是用JavaScript写的。该JavaScript函数创建DOMDocument.4.0类的实例,并把对该对象的引用保存在变量xmldoc里。使用DOMDocument 类的load(filename)方法,JavaScript函数载入xml文件并使用DOMDocument类的属性xml在信息框里显示xml文件的内容。

 
trial.xml
<?xml version="1.0"?>
<PEOPLEDETAILS>
 <NAME>John</NAME>
 <NAME>John</NAME>
 <NAME>John</NAME>
 <NAME>John</NAME>
 <NAME>John</NAME>
</PEOPLEDETAILS>
 
XMLDisplay.htm
<html>
<head>
<title>XML</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
 <form name="frmPatient" method="post" action="">
    <table width="41%" border="0">
      <tr>
      <td width="45%"><font size="2">Name
          of the XML File</font></td>
        <td width="24%">
          <input type="text" name="TxtName">
        </td>
        <td width="41%"><font size="2"><a href="#" οnclick="javascript:cmdSubmit_click()">Submit</a></font></td>
      </tr>
    </table>
 </form>
 <p align="left">&nbsp;</p>
<script Language="javascript">
function cmdSubmit_click()
{if (frmPatient.TxtName.value.length==0)
 {
      alert ("Invalid File Name");
 }
 else
 {
 var xmldoc= new ActiveXObject("Msxml2.DOMDocument.4.0");                                   xmldoc.load(frmPatient.TxtName.value);
      var error=xmldoc.parseError;      
      if(error!="")
      {
         alert("error");
      }
      else{        
         alert(xmldoc.xml);  
       }
 }
}
</script>
</body>
</html>
4.
你可以建立一个包含文本区和超链接的窗体。文本区接收用户输入的字符串。然后验证该字符串是不是形式良好的 xml 。用户需要点击 submit 超链接来验证它。
使用 JavaScript 编写的函数处理超链接的 onclick 事件。该JavaScript函数创建DOMDocument.4.0类的实例,并把对该对象的引用保存在变量xmldoc里。使用 DOMDocument 类的 loadxml(string) 方法, JavaScript 函数载入用户输入的字符串。使用 DOMDocument 类的属性 parseError , xml 文档的任何错误的信息都被放到变量 error 里。如果没有错误, JavaScript 函数使用 DOMDocument 的属性 xml 显示整个字符串,否则 JavaScript 函数显示 error 。
<html>
<head>
<title>XML</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
 <form name="frmPatient" method="post" action="">
   <table width="60%" border="0">
     <tr>
       <td width="60%"><font size="2">Enter the XML String Here
         </font></td>
 </tr>
 <tr>
        <td width="24%">
      <TEXTAREA cols=70 name=TxtName rows=20></TEXTAREA>
        </td>
 </tr>
 <tr>
        <td width="41%"><font size="2"><a href="#" οnclick="javascript:cmdSubmit_click()">Submit</a></font></td>
      </tr>
    </table>
 </form>
 <p align="left">&nbsp;</p>
<script Language="javascript">
function cmdSubmit_click()
{
 if (frmPatient.TxtName.value.length==0)
 {
      alert ("Invalid XML String");
 }
 else
 {
 var xmldoc= new ActiveXObject("Msxml2.DOMDocument.4.0");                                                                  xmldoc.loadXML(frmPatient.TxtName.value);
      var error=xmldoc.parseError;      
      if(error!="")
      {
         alert("error");
      }
      else
      {         
         alert(xmldoc.xml);  
      }
 }
}
</script>
</body></html>
5.
你需要建立一个网页,并建立文本区来接收XML标签。该网页显示包含一个文本区和一个超链接的窗体。文本区接收用户输入的字符串。然后验证输入的字符串是不是形式良好的xml。 用户需要点击 submit 超链接来验证它。
使用 JavaScript 函数处理超链接的 onclick 事件。该JavaScript函数创建DOMDocument.4.0类的实例,并把对该对象的引用保存在变量xmldoc里。使用 DOMDocument 类的 loadxml(string) 方法, JavaScript 函数载入用户输入的字符串。使用 DOMDocument 类的属性 parseError , xml 文档的任何错误的信息都被放到变量 error 里。如果没有错误,使用DOMDocument类的createElement(elementname)方法建立一个新元素“WELLFORMED”。使用 DOMDocument类的documentElement属性,JavaScript函数把对xml文件的根元素的引用存放在变量rootnode里。然后JavaScript函数调用appendChild(elementname)函数把该节点附在根元素上。使用节点的text属性,JavaScript函数把WELLFORMED元素的文本置为good。然后JavaScript函数把文本区的文本置为新的xml字符串。
<! --- XMLDisplayStringNewNode.htm -- >
<html>
<head>
<title>XML</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
 <form name="frmPatient" method="post" action="">
    <table width="60%" border="0">
      <tr>
        <td width="60%"><font size="2">Enter the XML String Here
         </font></td>
   </tr>
   <tr>
        <td width="24%">
   <TEXTAREA cols=70 name=TxtName rows=20></TEXTAREA>
        </td>
   </tr>
   <tr>
        <td width="41%"><font size="2"><a href="#" οnclick="javascript:cmdSubmit_click()">Submit</a></font></td>
      </tr>
    </table>
 </form>
 <p align="left">&nbsp;</p>
<script Language="javascript">
function cmdSubmit_click()
{
   var newelement;
   var rootnode;
   if (frmPatient.TxtName.value.length==0)
   {
      alert ("Invalid XML String");
   }
   else
   {
      var xmldoc= new ActiveXObject("Msxml2.DOMDocument.4.0");                                                                                                  xmldoc.loadXML(frmPatient.TxtName.value);
      var error=xmldoc.parseError;      
      if(error!="")
      {
          alert("error");
      }
      else
      {
          rootnode=xmldoc.documentElement;
          newelement=xmldoc.createElement("WELLFORMED");                                                                                  rootnode.appendChild(newelement);
          rootnode.lastChild.text = "good"; 
          frmPatient.TxtName.value=xmldoc.xml
      }
   }
   }
</script>
</body>
</html>
 
 
6.
你可以建立包含一个文本区和一个超链接的窗体。文本区接收用户输入的字符串。然后验证输入的字符串是不是形式良好的xml。 用户需要点击 submit 超链接来验证它。要建立的 HTML 网页的代码如下:
<html>
<head>
<title>XML</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
 <form name="frmPatient" method="post" action="">
    <table width="60%" border="0">
      <tr>
        <td width="60%"><font size="2">Enter the XML String Here
         </font></td>
 </tr>
 <tr>
    <td width="24%">
 <TEXTAREA cols=70 name=TxtName rows=20></TEXTAREA>
        </td>
 </tr>
 <tr>
   <td width="41%"><font size="2"><a href="#" οnclick="javascript:cmdSubmit_click()">Submit</a></font></td>
      </tr>
 <tr>
 <td width="41%"><font size="2"><a href="#" οnclick="javascript:cmdReset_click()">Reset</a></font></td>
      </tr>
    </table>
 </form>
 <p align="left">&nbsp;</p>
<script Language="javascript">
function cmdSubmit_click()
{
 var newelement;
 var rootnode;
 if (frmPatient.TxtName.value.length==0)
 {
      alert ("Invalid XML String");
 }
 else
 {
 var xmldoc= new ActiveXObject("Msxml2.DOMDocument.4.0");                                                                                            xmldoc.loadXML(frmPatient.TxtName.value);
 var error=xmldoc.parseError;      
 if(error!="")
 {
 alert("error");
 }
 else
 {
 rootnode=xmldoc.documentElement;
 newelement=xmldoc.createElement("WELLFORMED");                                                                                               rootnode.appendChild(newelement);
 rootnode.lastChild.text = "good"; 
 frmPatient.TxtName.value=xmldoc.xml
 }
 }
}
function cmdReset_click()
{
 var deleteelements;
 var rootnode;
 if (frmPatient.TxtName.value.length==0)
 {
      alert ("Invalid XML String");
 }
 else
 {
var xmldoc= new ActiveXObject("Msxml2.DOMDocument.4.0");                                                                           xmldoc.loadXML(frmPatient.TxtName.value);
      var error=xmldoc.parseError;      
      if(error!="")
      {
         alert("error");
      }
      else
      {
         rootnode=xmldoc.documentElement;
         deleteelements=xmldoc.getElementsByTagName("WELLFORMED");                                                                             
         for (var ctr=0; ctr<deleteelements.length; ctr++)
         {
         rootnode.removeChild(deleteelements.item(ctr));
      }          frmPatient.TxtName.value=xmldoc.xml
 
      }
 }
}
</script>
</body>
</html>
 
在上面的 HTML 代码中,使用 JavaScript 函数处理超链接的 onclick 事件。该JavaScript函数创建DOMDocument.4.0类的实例,并把对该对象的引用保存在变量xmldoc里。使用 DOMDocument 类的 loadxml(string) 方法, JavaScript 函数载入用户输入的字符串。使用 DOMDocument 类的属性 parseError , xml 文档的任何错误的信息都被放到变量 error 里。如果没有错误,使用DOMDocument类的createElement(elementname)方法建立一个新元素“WELLFORMED”。使用 DOMDocument类的documentElement属性,JavaScript函数把xml文件的根元素的引用存放在变量rootnode里。然后JavaScript函数调用appendChild(elementname)函数把该节点附在根元素上。使用节点的text属性,JavaScript函数把WELLFORMED元素的文本置为good。然后JavaScript函数把文本区的文本置为新的xml字符串。
该 html 网页还提供一个称为 Reset 的超链接。点击该链接,得到称为 WELLFORMED 节点集。该 JavaScript 函数使用 DOMDocument 类的 getElementsbyTagName(elementname) 方法。然后, JavaScript 函数循环函数返回的元素个数,并使用 removeChild 函数来删除节点。然后 JavaScript 函数把文本框的文本置为新 xml 字符串。
7.
下面的 XSLT 样式表用来显示学生成绩的平均值。
student.xsl – 该 XSLT 样式表使用 XPath 语言计算数学,社科,科学专业的学生的成绩的总和并把总和除以 3 来得到平均成绩。
使用转换 xpath/xslt 语法需要的 html 文件。
<! -- student.xsl -- >
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
 <p align="center"><font color="blue">STUDENT DETAILS</font></p>
 <B>STUDENT ID:</B> <xsl:value-of select="MARKSSUMMARY/STUDENT/@ID"/> <br/>
 Maths Total: <xsl:value-of select='sum(//MARKSSUMMARY/STUDENT/TEST/MATHS) div 3'/> <br/>
      Science Total:<xsl:value-of select='sum(//MARKSSUMMARY/STUDENT/TEST/SCIENCE) div 3'/><br/>
      Social Total:<xsl:value-of select='sum(//MARKSSUMMARY/STUDENT/TEST/SOCIALSTUDIES) div 3'/><br/>
</xsl:template>
</xsl:stylesheet>
 
<! -- student.xml -- >
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="student.xsl"?>
<MARKSSUMMARY>
<STUDENT ID="S001">
 <TEST SCHEME="QUARTERLY">
      <MATHS>90</MATHS>
      <SCIENCE>100</SCIENCE>
      <SOCIALSTUDIES>90</SOCIALSTUDIES>
 </TEST>
 <TEST SCHEME="HALFYEARLY">
      <MATHS>80</MATHS>
      <SCIENCE>60</SCIENCE>
      <SOCIALSTUDIES>75</SOCIALSTUDIES>
 </TEST>
 <TEST SCHEME="FINAL">
      <MATHS>70</MATHS>
      <SCIENCE>70</SCIENCE>
      <SOCIALSTUDIES>45</SOCIALSTUDIES>
 </TEST>
</STUDENT>
</MARKSSUMMARY>
8.定义xml文档结构的语言是 DTD and XSD
9. 下面哪些是真的?
a.         简单数据类型包括元素-假
b.        复杂数据类型包括元素和属性-真
10. 允许脚本语言访问和操纵XML文档的对象模型称为 文档对象模型
 
补充参考文献
Erik .T Ray, Learning XML
Steven Holzner, Inside XML
Elliotte Rusty Harold, W. Scott Means, XML in a Nutshell: A Desktop Quick Reference
John Duckett, Professional XML 模式
John Griffin, XML and SQL Server 2000
John Robert Gardner, Zarella .L Rendon, XSLT and XPATH: A Guide to XML Transformations
Elliotte Rusty Harold, XML Bible
Kurt Cagle, Beginning XML
Mark Birbeck, Professional XML
Paul .J Burke, Professional SQL Server 200 XML
Paul Deitel, The Complete XML Training Course
Graeme Malcom, Programming Microsoft SQL Server 2000 with XML
Dave Mercer, XML: A Beginner's Guide
Michael .J Young, Step by Step XML
James Bean, XML Globalization and Best Practices: Using XML 模式 and XML Data
 
 
网站列表
n    Welcome to XML Spy! –
n    IONA XMLBUS –
n    XML From the Inside Out –
n    Extensible Markup Language –
n    Java ™ Technology & XML –
n    XML Tutorial –
n    WDVL: XML: Extensible Markup Language –
n    Welcome to the Apache XML Project - 
                     http://xml.apache.org/
n    DeveloperWorks: XML –
n    expat - XML Parser Toolkit –
n    XML Global Technologies - Consulting –
n    XML Magazine –
n    WebDeveloper.com -
n    Project Cool XML Zone –
n    Xmlpitstop.com –
n    XML Script – XML Productivity Applications –
n    Introduction to DSSSL –
 
n    The XML Cover Pages DSSSL - Document Style Semantics and Specification Language. ISO/IEC 10179:1996 –
n    DSSSL Document Style Sheet Semantics and Specification Language - 
    
 
 

课程安排:可扩展标记语言
周期 #
 
活动 / 问题 No.
时间(分钟)
 
周期 1
 
 
 
 
 
OCR1
 
 
 
 
 
第一课:目标
5
 
 
 
EDI and XML EDI XML
45
 
 
 
XML 文档的组件
45
 
 
 
1.P.1
20
 
 
 
小结
5
 
 
 
总计
120
 
 
OCR2
 
 
 
 
 
第二课:目标
5
 
 
 
使用 DTD
50
 
 
 
JAM
10
 
 
 
使用模式
20
 
 
 
2.P.1
25
 
 
 
小结
10
 
 
 
Total 总计
120
 
周期 2
 
 
 
 
 
OCR1
 
 
 
 
 
第三课:目标
2
 
 
 
模式的属性
40
 
 
 
JAM
10
 
 
 
使用名称空间
10
 
 
 
导入模式
25
 
 
 
JAM
10
 
 
 
小结
8
 
 
 
总计
105
 
 
OCR2
 
 
 
 
 
第四课:目标
5
 
 
 
XML schema 中创建元素和属性组
30
 
 
 
JAM
10
 
 
 
4.P.2
60
 
 
 
小结
5
 
 
 
总计
110
 
周期 3
 
 
 
 
 
OCR1
 
 
 
 
 
第五课:目标
5
 
 
 
CSS
20
 
 
 
JAM
10
 
 
 
XSLT
45
 
 
 
5.P.1
20
 
 
 
小结
10
 
 
 
总计
110
 
 
OCR2
 
 
 
 
 
第六课:目标
5
 
 
 
条件格式化
15
 
 
 
JAM
10
 
 
 
XPath
40
 
 
 
XSL/T 中的 HTML
20
 
 
 
6.P.1
20
 
 
 
嵌套样式表
5
 
 
 
小结
5
 
 
 
总计
120
 
周期 4
OCR1
 
 
 
 
 
第七课:目标
5
 
 
 
介绍 XML DOM
60
 
 
 
7.D.1
20
 
 
 
JAM
10
 
 
 
小结
5
 
 
 
总计
100
 
 
OCR2
 
 
 
 
 
第八课:目标
5
 
 
 
验证 XML 文档相对于模式的正确性
25
 
 
 
JAM
5
 
 
 
动态应用样式表
25
 
 
 
8.P.1
40
 
 
 
小结
5
 
 
 
总计
105
 
周期 5
OCR1
 
 
 
 
 
第九课:目标
5
 
 
 
SQL 生成 XML 文档
20
 
 
 
JAMs
10
 
 
 
Xpath 查询
30
 
 
 
插入 XML 数据
30
 
 
 
小结
5
 
 
 
总计
100
 
 
OCR2
 
 
 
 
 
第十课:目标
5
 
 
 
XLink
20
 
 
 
XPointer
20
 
 
 
小结
5
 
 
 
总计
50
 
 
 
 
 
 
 
 ok
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值