跳轉到內容

XML - 管理資料交換/遞迴關係/答案

來自 Wikibooks,開放世界中的開放書籍

練習 2a

[編輯 | 編輯原始碼]
  • 建立一個描述接力賽中一個隊的模式。該資訊需要描述比賽中的跑步者以及跑步者從誰那裡接過接力棒。建立一個包含此模式的示例資料的 XML 檔案,並用至少四個跑步者填充它。確保 XML 文件格式良好且有效。

答案

<?xml version="1.0" encoding="UTF-8"?>

&lt;!--
    Document   : appetizerXML.xml
    Created on : March 28, 2004, 9:46 PM
    Author     : Jess Russell
    Description:
        Purpose of the document follows.
--&gt;

<race xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="relayXSD.xsd">
    <runner primaryKey="1">
        <firstName>Jesse</firstName>
        <lastName>Owens</lastName>
    </runner>
    <runner primaryKey="2">
        <firstName>Bruce</firstName>
        <lastName>Jenner</lastName>
        <predecessor foreignKey="1"/>
    </runner>
    <runner primaryKey="3">
        <firstName>Clarke</firstName>
        <lastName>Kent</lastName>
        <predecessor foreignKey="2"/>
    </runner>
    <runner primaryKey="4">
        <firstName>Steve</firstName>
        <lastName>Austin</lastName>
        <predecessor foreignKey="3"/>
    </runner>
    <runner primaryKey="5">
        <firstName>Jamie</firstName>
        <lastName>Summers</lastName>
        <predecessor foreignKey="4"/>
    </runner>
    <runner primaryKey="6">
        <firstName>Road</firstName>
        <lastName>Runner</lastName>
        <predecessor foreignKey="5"/>
    </runner>
</race>

檔案 relayXML.xml

<?xml version="1.0" encoding="UTF-8"?>

&lt;!--
    Document   : relayXSD.xml
    Created on : March 28, 2004, 9:46 PM
    Author     : Jess Russell
    Description:
        Purpose of the document follows.
--&gt;

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" attributeFormDefault="unqualified">
    <xsd:element name="race">
        <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="runner" type="runnerType" maxOccurs="10">    
                        </xsd:element>
                    </xsd:sequence>
        </xsd:complexType>
                <xsd:keyref name="predecessorKey" refer="runKey">
                        <xsd:selector xpath="runner/predecessor"/>
                        <xsd:field xpath="@foreignKey"/>
                </xsd:keyref>
        <xsd:unique name="runIdChecker">
            <xsd:selector xpath="runner"/>
            <xsd:field xpath="@primaryKey"/>
        </xsd:unique>
        <xsd:unique name="oneToOneChecker">
            <xsd:selector xpath="runner/predecessor"/>
            <xsd:field xpath="@foreignKey"/>
        </xsd:unique>
        <xsd:key name="runKey">
            <xsd:selector xpath="runner"/>
            <xsd:field xpath="@primaryKey"/>
        </xsd:key>
    </xsd:element>
    
    <xsd:complexType name="runnerType">
        <xsd:sequence>
            <xsd:element name="firstName" type="xsd:string"/>
            <xsd:element name="lastName" type="xsd:string"/>
            <xsd:element name="predecessor" type="predecessorType" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="primaryKey" type="xsd:long" use="required"/>
    </xsd:complexType>
    
    <xsd:complexType name="predecessorType">
        <xsd:attribute name="foreignKey" type="xsd:long" use="required"/>
    </xsd:complexType>
</xsd:schema>

檔案 relayXSD.xsd

<?xml version="1.0" encoding="UTF-8"?>

&lt!--
    Document   : appetizerXML.xml
    Created on : March 28, 2004, 9:46 PM
    Author     : Jess Russell
    Description:
        Purpose of the document follows.
--&gt;

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
	<xsl:key name="predecessor" match="runner" use="@primaryKey"/>
	<!--xsl:key name="name referenced from within XSL file" match="element in XML file containing key" use="attribute or sub-element containing actual value of key "-->
	<!--	key() function use:
		key('predecessor',2) will return the nodes contained by the president element with attribute: primaryKey="2"
		Since a node list is returned, <xsl:value-of select="key('predecessor',2)/firstName"/> will output John
	-->
	<xsl:output method="html"/>
	<xsl:template match="/">
        <html>
        <head>
        <style>
        BODY {background-color:darkblue}
        </style>
        </head>
        <body>
            &lt;table style="background-color:gray; color:darkblue;margin-left:auto; margin-right:auto"&gt;
                &lt;tr style="background-color:lightblue;font-weight:bold">
                        &lt;td&gt;Runner First Name&lt;/td&gt;
                        &lt;td&gt;Runner Last Name&lt;/td&gt;
                        &lt;td&gt;Predecessor First Name&lt;/td&gt;
                        &lt;td&gt;Predecessor Last Name&lt;/td&gt;
                &lt;/tr&gt;
                <xsl:for-each select="//runner">
                    &lt;tr style="background-color:salmon">
                        &lt;td&gt;
                            <xsl:value-of select="firstName"/>
                        &lt;/td&gt;
                        &lt;td&gt;
                            <xsl:value-of select="lastName"/>
                        &lt;/td&gt;
                        <xsl:choose>
                            <!--XSL if-else structure-->
                            <xsl:when test="key('predecessor',predecessor/@foreignKey)">
                                <!-- if there is a predecessor-->
                                &lt;td&gt;
                                    <xsl:value-of select="key('predecessor',predecessor/@foreignKey)/firstName"/>
                                &lt;/td&gt;
                                &lt;td&gt;
                                    <xsl:value-of select="key('predecessor',predecessor/@foreignKey)/lastName"/>
                                &lt;/td&gt;
                            </xsl:when>
                            <xsl:otherwise>
                                <!-- else-->
                                &lt;td colspan="2" style="text-align:center">This Runner started the race&lt;/td&gt;
                            </xsl:otherwise>
                        </xsl:choose>
                    &lt;/tr&gt;
                </xsl:for-each>
            &lt;/table&gt;            </body>
            </html>
	</xsl:template>

</xsl:stylesheet>

檔案 relayXSL.xsl

  • 每個州都有許多人壽保險銷售人員,每個州的區域(北、南、東、西)都有一個區域主管銷售人員。銷售人員只能在一個區域銷售,並且只能有一個主管銷售人員。建立一個模式來描述這種關係。建立一個 XML 文件並用兩個州的資料填充它。確保 XML 文件格式良好且有效。每個州應至少有兩個區域的資料,每個區域應至少有三個銷售人員,包括區域主管。每個銷售人員應透過一個數字唯一標識。每個州應透過其兩個字母縮寫唯一標識。建立一個 XSL 樣式表來顯示這些資料,每個州有一個單獨的表格。如果銷售人員是區域主管,則應說明這一點。在樣式表中建立一個名為 doublespace 的實體,它等效於兩個回車符。使用新實體在兩個表格之間建立兩行空白。

答案

<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>

&lt;!--
    Document   : insuranceXML.xml
    Created on : March 21, 2004, 11:26 PM
    Author     : russell
    Description:
        Purpose of the document follows.
--&gt;

<insuranceInfo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  xsi:noNamespaceSchemaLocation='file:/Users/russell/Courses/MIST7700/XML/ch6-assn/insuranceXSD.xsd'>
<state stateAbbr = "GA">
<stateName>Georgia</stateName>

    <region regionId = "1">
        <regionName>East</regionName>
        <salesPerson salesPersonId="1">
            <firstName>Joe</firstName>
            <lastName>Schmo</lastName>
        </salesPerson>
        <salesPerson salesPersonId="2">
            <firstName>Jim</firstName>
            <lastName>Beam</lastName>
            <regionHead fk_salesPersonId = "1"/>
        </salesPerson>
        <salesPerson salesPersonId="3">
            <firstName>Johnny</firstName>
            <lastName>Walker</lastName>
            <regionHead fk_salesPersonId = "1"/>
        </salesPerson>
    </region>

    <region regionId="2">
        <regionName>West</regionName>
        <salesPerson salesPersonId="4">
            <firstName>Ian</firstName>
            <lastName>Fleming</lastName>
        </salesPerson>
        <salesPerson salesPersonId="5">
            <firstName>Tom</firstName>
            <lastName>Clancy</lastName>
            <regionHead fk_salesPersonId = "4"/>
        </salesPerson>
            <salesPerson salesPersonId="6">
            <firstName>Conan</firstName>
            <lastName>Doyle</lastName>
            <regionHead fk_salesPersonId = "4"/>
        </salesPerson>
    </region>
    </state>

    <state stateAbbr = "NJ">
    <stateName>New Jersey</stateName>

    <region regionId = "3">
    <regionName>East</regionName>
        <salesPerson salesPersonId="7">
            <firstName>Tony</firstName>
            <lastName>Stark</lastName>
        </salesPerson>
        <salesPerson salesPersonId="8">
            <firstName>Peter</firstName>
            <lastName>Parker</lastName>
            <regionHead fk_salesPersonId = "7"/>
        </salesPerson>
        <salesPerson salesPersonId="9">
            <firstName>Johnny</firstName>
            <lastName>Storm</lastName>
            <regionHead fk_salesPersonId = "7"/>
        </salesPerson>
    </region>

    <region regionId="4">
        <regionName>West</regionName>
        <salesPerson salesPersonId="10">
            <firstName>Sue</firstName>
            <lastName>Storm</lastName>
        </salesPerson>
        <salesPerson salesPersonId="11">
            <firstName>Bruce</firstName>
            <lastName>Banner</lastName>
            <regionHead fk_salesPersonId = "10"/>
        </salesPerson>
        <salesPerson salesPersonId="12">
            <firstName>Conan</firstName>
            <lastName>Thebarbarian</lastName>
            <regionHead fk_salesPersonId = "10"/>
        </salesPerson>
    </region>
</state>
</insuranceInfo>

檔案 insuranceXML.xml

<?xml version="1.0" encoding="UTF-8"?>

&lt!--
    Document   : appetizerXML.xml
    Created on : March 28, 2004, 9:46 PM
    Author     : Jess Russell
    Description:
        Purpose of the document follows.
--&gt;

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xsd:element name="insuranceInfo">
    <xsd:complexType>
    <xsd:sequence>    
       <xsd:element name="state" maxOccurs="unbounded">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="stateName" type="xsd:string"/> 
                    <xsd:element name="region" type="regionInfo" maxOccurs="4"/>

                </xsd:sequence>
                <xsd:attribute name="stateAbbr" type="xsd:string" use="required"/>
            </xsd:complexType>
            <xsd:unique name="regionChecker">
                <xsd:selector xpath="region"/>
                <xsd:field xpath="@regionId"/>
            </xsd:unique>
            <xsd:unique name="salesPersonChecker">
                <xsd:selector xpath="region/salesPerson"/>
                <xsd:field xpath="@salesPersonId"/>
            </xsd:unique>
            <xsd:key name="salesPersonKey">
                <xsd:selector xpath="salesPerson"/>
                <xsd:field xpath="@salesPersonId"/>
            </xsd:key>
            <xsd:keyref name="salesPersonForeignKey" refer="salesPersonKey">
                <xsd:selector xpath="state"/>
                <xsd:field xpath="@fk_salesPersonId"/>
            </xsd:keyref>

        </xsd:element>
        </xsd:sequence>
        </xsd:complexType>
        <xsd:unique name="stateChecker">
            <xsd:selector xpath="state"/>
            <xsd:field xpath="@stateAbbr"/>
        </xsd:unique>
    </xsd:element>
    <xsd:complexType name="regionInfo">
        <xsd:sequence>
            <xsd:element name="regionName" type="xsd:string"/>
            <xsd:element name="salesPerson" type="salesPersonInfo" maxOccurs="unbounded">
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="regionId" type="xsd:long" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="salesPersonInfo">
        <xsd:sequence>
            <xsd:element name="firstName" type="xsd:string"/>
            <xsd:element name="lastName" type="xsd:string"/>
            <xsd:element name="regionHead" minOccurs="0" maxOccurs="1">
                <xsd:complexType>
                    <xsd:attribute name="fk_salesPersonId" type="xsd:long" use="required"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="salesPersonId" type="xsd:long" use="required"/>
    </xsd:complexType>

    
</xsd:schema>

檔案 insuranceXSD.xsd

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stylesheet [<!ENTITY space "<xsl:text xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> </xsl:text>"> <!ENTITY dblspace "<br /><br />">]>
&lt;!-- The namespace attribute above is only necessary for XML parsers using the MSXML parser--&lt;
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:key name="regionHead" match="salesPerson" use="@salesPersonId"/>
    <xsl:output method="html"/>
    <xsl:template match="insuranceInfo">
    <xsl:for-each select="state">
    <xsl:variable name = "state"><xsl:value-of select="stateName"/></xsl:variable>
        <xsl:for-each select="region">
            			&lt;table&gt;
                &lt;tr style="background-color:#6495ED;font-weight:bold">
                    &lt;td colspan="3">
                        State Name: <xsl:value-of select="$state"/><br />
                        Region Id: <xsl:value-of select="@regionId"/><br />
                        Region Name: <xsl:value-of select="regionName"/><br />
                    &lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr style="background-color:#F0E68C;font-weight:bold">
                    &lt;td&gt;Sales Person Id&lt;/td&gt;&lt;td&gt;Sales Person Name&lt;/td&gt;&lt;td&gt;Region Head&lt;/td&gt;
                &lt;/tr&gt;
                <xsl:for-each select="salesPerson">
                &lt;tr style="background-color:#D3D3D3">
                    &lt;td&gt;<xsl:value-of select="@salesPersonId"/>&lt;/td&gt;
                    &lt;td&gt;<xsl:value-of select="firstName"/>&space;<xsl:value-of select="lastName"/>&lt;/td&gt;
                    <xsl:choose>
                            <xsl:when test="regionHead">
                                &lt;td&gt;
                                    <xsl:value-of select="key('regionHead',regionHead/@fk_salesPersonId)/firstName"/>&space;
                                    <xsl:value-of select="key('regionHead',regionHead/@fk_salesPersonId)/lastName"/>&lt;/td&gt;
                            </xsl:when>
                            <xsl:otherwise>
                                &lt;td style="background-color:#FF0000;font-weight:bold">Region Head&lt;/td&gt;
                            </xsl:otherwise>
                    </xsl:choose>
                &lt;/tr&gt;				
                </xsl:for-each>		
            &lt;/table&gt;
            <br />
        </xsl:for-each>&dblspace;
    </xsl:for-each>	
    </xsl:template>
    
      <xsl:template match="/">
        <html>
            <head>
                <title>Insurance Regions</title>
            </head>
            <body style="background-color:darkblue">
            <xsl:apply-templates select = "insuranceInfo"/>
            </body>
        </html>
    </xsl:template>
    
</xsl:stylesheet>

檔案 insuranceXSL.xsl

  • 一家餐廳在其選單上有許多開胃菜。餐廳還可以建立一個拼盤,它是由精選開胃菜的小份組合而成的。建立一個模式來描述這種關係。建立一個 XML 文件並用足夠多的開胃菜填充它,以建立至少兩個拼盤組。確保 XML 文件格式良好且有效。

答案

<?xml version="1.0" encoding="UTF-8"?>

&lt!--
    Document   : appetizerXML.xml
    Created on : March 28, 2004, 9:46 PM
    Author     : Jess Russell
    Description:
        Purpose of the document follows.
--&gt;

<appetizers xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  xsi:noNamespaceSchemaLocation='file:/Users/russell/Courses/MIST7700/XML/ch6-assn/appetizersXSD.xsd'>
    <appetizer appetizerId="1">
        <appetizerName>Buffalo Wings</appetizerName>
        <appetizerPrice>7.99</appetizerPrice>
    </appetizer>
    <appetizer appetizerId="2">
        <appetizerName>Mozerella Sticks</appetizerName>
        <appetizerPrice>4.99</appetizerPrice>
    </appetizer>
    <appetizer appetizerId="3">
        <appetizerName>Potato Skins</appetizerName>
        <appetizerPrice>5.99</appetizerPrice>
    </appetizer>
    <appetizer appetizerId="4">
        <appetizerName>Onion Blossom</appetizerName>
        <appetizerPrice>7.99</appetizerPrice>
    </appetizer>
    <appetizer appetizerId="5">
        <appetizerName>Chips and Salsa</appetizerName>
        <appetizerPrice>2.49</appetizerPrice>
    </appetizer>
    <appetizer appetizerId="6">
        <appetizerName>Pot Stickers</appetizerName>
        <appetizerPrice>5.99</appetizerPrice>
    </appetizer>
    <appetizer appetizerId="7">
        <appetizerName>Wings and Things Sampler</appetizerName>
        <appetizerPrice>12.99</appetizerPrice>
        <samplerAppetizer fk_samplerAppetizerId="1"/>
        <samplerAppetizer fk_samplerAppetizerId="2"/>
        <samplerAppetizer fk_samplerAppetizerId="3"/>
    </appetizer>
    <appetizer appetizerId="8">
        <appetizerName>Ultimate Sampler</appetizerName>
        <appetizerPrice>19.99</appetizerPrice>
        <samplerAppetizer fk_samplerAppetizerId="1"/>
        <samplerAppetizer fk_samplerAppetizerId="2"/>
        <samplerAppetizer fk_samplerAppetizerId="3"/>
        <samplerAppetizer fk_samplerAppetizerId="4"/>
        <samplerAppetizer fk_samplerAppetizerId="5"/>
        <samplerAppetizer fk_samplerAppetizerId="6"/>
    </appetizer>

</appetizers>

檔案 appetizerXML.xml

<?xml version="1.0" encoding="UTF-8"?>

&lt;!--
    Document   : appetizerXML.xml
    Created on : March 28, 2004, 9:46 PM
    Author     : Jess Russell
    Description:
        Purpose of the document follows.
--&gt;

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xsd:element name="appetizers">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="appetizer" type="appetizerInfo" minOccurs="0" maxOccurs="unbounded">
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    <xsd:unique name="appetizerChecker">
        <xsd:selector xpath="appetizer"/>
        <xsd:field xpath="@appetizerId"/>
    </xsd:unique>
    <xsd:key name="appetizerKey">
        <xsd:selector xpath="appetizer"/>
        <xsd:field xpath="@appetizerId"/>
    </xsd:key>
    <xsd:keyref name="samplerAppetizerKey" refer="appetizerKey">
        <xsd:selector xpath="samplerAppetizer"/>
        <xsd:field xpath="@fk_samplerAppetizerId"/>
    </xsd:keyref>
    </xsd:element>
    <xsd:complexType name="appetizerInfo">
        <xsd:sequence>
            <xsd:element name="appetizerName"/>
            <xsd:element name="appetizerPrice" type="xsd:decimal"/>
            <xsd:element name="samplerAppetizer" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:attribute name="fk_samplerAppetizerId" type="xsd:long" use="required"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="appetizerId" type="xsd:long" use="required"/>
    </xsd:complexType>
</xsd:schema>

檔案 appetizerXSD.xsd

華夏公益教科書