Anna, Alvar, Urmas: Difference between revisions

From ICO wiki
Jump to navigationJump to search
No edit summary
 
(17 intermediate revisions by 2 users not shown)
Line 4: Line 4:




==Rühma liikmed:==
=Rühma liikmed:=


Anna Lutsepp
Anna Lütsepp
Alvar Väinola
Alvar Väinola
Urmas Pill
Urmas Pill


==XML faili kirjeldus==
=XML=
 
TeamFoundation projekt (urmas.visualstudio.com):
[https://urmas.visualstudio.com/DefaultCollection/XML%20for%20IT%20College]
 
==Faili kirjeldus==


Võtsin xml tekitamise aluseks ühe majandustarkvarast pakutava demoandmetega kaupade tabeli. Sealt sai võetud mõned "huvitavamad" andmed ning lisatud ka setud tabelist kaupadega seotud dimensioonide vaikeväärtused. Tulemuseks on xml fail, mille nimeks on meie TeamFoundationi projektis Example1.xml
Võtsin xml tekitamise aluseks ühe majandustarkvarast pakutava demoandmetega kaupade tabeli. Sealt sai võetud mõned "huvitavamad" andmed ning lisatud ka setud tabelist kaupadega seotud dimensioonide vaikeväärtused. Tulemuseks on xml fail, mille nimeks on meie TeamFoundationi projektis Example1.xml
Line 18: Line 23:
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>
<ItemList>
<ItemList>
<TableID>27</TableID>
  <TableID>27</TableID>
<PageID>31</PageID>
  <PageID>31</PageID>
<DataTemplate>ITEM01</DataTemplate>
  <DataTemplate>ITEM01</DataTemplate>
<Item>
  <Item>
<No ValidateField="1" ProcessingOrder="1">1000</No>
    <No ValidateField="1" ProcessingOrder="1">1000</No>
<No2 ValidateField="1" ProcessingOrder="2"></No2>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
<Description ValidateField="1" ProcessingOrder="3">Bicycle</Description>
    <Description ValidateField="1" ProcessingOrder="3">Bicycle</Description>
<Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
<BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
<UnitPrice ValidateField="1" ProcessingOrder="14">4000</UnitPrice>
    <UnitPrice ValidateField="1" ProcessingOrder="14">4000</UnitPrice>
<UnitCost ValidateField="1" ProcessingOrder="18">350.594</UnitCost>
    <UnitCost ValidateField="1" ProcessingOrder="18">350.594</UnitCost>
<ReorderPoint ValidateField="1" ProcessingOrder="27">0</ReorderPoint>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">0</ReorderPoint>
<GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
<NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
<UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
<TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
<DefaultDimensions>
    <DefaultDimensions>
<Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
<Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PRODUCTION</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PRODUCTION</Dimension>
<Dimension GlobalDimension="0" DimensionCode="CATEGORY">FINISHED</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">FINISHED</Dimension>
<Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>     
</DefaultDimensions>
    </DefaultDimensions>
</Item>
  </Item>
<Item>
  <Item>
<No ValidateField="1" ProcessingOrder="1">1001</No>
    <No ValidateField="1" ProcessingOrder="1">1001</No>
<No2 ValidateField="1" ProcessingOrder="2"></No2>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
<Description ValidateField="1" ProcessingOrder="3">Touring Bicycle</Description>
    <Description ValidateField="1" ProcessingOrder="3">Touring Bicycle</Description>
<Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
<BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
<UnitPrice ValidateField="1" ProcessingOrder="14">4000</UnitPrice>
    <UnitPrice ValidateField="1" ProcessingOrder="14">4000</UnitPrice>
<UnitCost ValidateField="1" ProcessingOrder="18">350.594</UnitCost>
    <UnitCost ValidateField="1" ProcessingOrder="18">350.594</UnitCost>
<ReorderPoint ValidateField="1" ProcessingOrder="27">0</ReorderPoint>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">0</ReorderPoint>
<GrossWeight ValidateField=
    <GrossWeight ValidateField=
</ItemList>
</ItemList>
</source>
==XML schema (XSD)==
Schema on püütud teha võimalikult täpseks - automaatselt tekitatud failile on lisatud vajalikud tüübikirjeldused ning vastavalt ka ära muudetud andmete tüübid.
<source lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="Code20">
    <xs:restriction base="xs:string">
      <xs:maxLength value="20"/>
      <xs:pattern value="([A-Z0-9])+"/>   
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="Code20B">
    <xs:restriction base="xs:string">
      <xs:maxLength value="20"/>
      <xs:pattern value="([A-Z0-9])*"/>   
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="Code10">
    <xs:restriction base="xs:string">
      <xs:maxLength value="10"/>
      <xs:pattern value="([A-Z0-9])+"/>   
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="Text50">
    <xs:restriction base="xs:string">
      <xs:maxLength value="50"/>
    </xs:restriction>
  </xs:simpleType>
 
  <xs:element name="ItemList">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="TableID" type="xs:unsignedInt" />
        <xs:element name="PageID" type="xs:unsignedInt" />
        <xs:element name="DataTemplate" type="xs:string" />
        <xs:element maxOccurs="unbounded" name="Item">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="No" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Code20">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="No2" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Code20B">                   
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>                     
                </xs:complexType>
              </xs:element>
              <xs:element name="Description" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Text50">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="Description2" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Text50">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="BaseUnitofMeasure" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Code10">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="UnitPrice" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="UnitCost" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="ReorderPoint">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="GrossWeight">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="NetWeight">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="UnitVolume">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="TariffNo">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Code20B">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="DefaultDimensions">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="Dimension">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="Code20B">
                            <xs:attribute name="GlobalDimension" type="xs:unsignedByte" use="required" />
                            <xs:attribute name="DimensionCode" type="xs:string" use="required" />
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
</source>
==Style Sheet 1==
Lihtne stiilileht, mis konverteerib Example XML-i tavaliseks tabeliks. Natuke erilisemaks teeb see, et ka kaks dimensiooni kaasatakse tavalisse tabelisse
Failinimi Team Foundation-is on Items 1.xslt
Example1.xml ja Items 1.xslt koostöö on nähtav [[Anna,_Alvar,_Urmas_Items1AsHTML|siin]]
<source lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="html" indent="yes"/>
  <xsl:template match="/">
    <html>
      <head>
        <title>Just item list</title>
      </head>
      <body>
        <p>
          <h1>
            Item list
          </h1>
        </p>
        <table border="0">
          <tr>
            <th>Item No.</th>   
            <th>Description</th>         
            <th>UOM</th>               
            <th>Unit Price</th>               
            <th>Unit Cost</th>                     
            <th>Reorder Point</th>
            <th>Category</th>     
            <th>Product Group</th>     
          </tr>
          <xsl:for-each select="ItemList/Item">
            <tr>
              <td><xsl:value-of select="No"/></td>     
              <td><xsl:value-of select="Description"/></td>
              <td><xsl:value-of select="BaseUnitofMeasure"/></td>
              <td><xsl:value-of select="UnitPrice"/></td>     
              <td><xsl:value-of select="UnitCost"/></td>
              <td><xsl:value-of select="ReorderPoint"/></td>
              <xsl:for-each select="DefaultDimensions/Dimension">
                <xsl:if test="@DimensionCode='CATEGORY'">
                  <td><xsl:value-of select="."/></td>                       
                </xsl:if>         
              </xsl:for-each> 
              <xsl:for-each select="DefaultDimensions/Dimension">
                <xsl:if test="@DimensionCode='PRODGROUP'">
                  <td><xsl:value-of select="."/></td>                       
                </xsl:if>         
              </xsl:for-each> 
            </tr>     
          </xsl:for-each>
        </table>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
</source>
==Style Sheet 2==
Sellega sai "natuke" vaeva nähtud. Unikaalsete rühma liikmete (antud faili puhul siis kategooriate) leidmine oli ilma Xpath 2.0-ita ja ilma igasuguse teadmiseta KEY konstruktsiooni kasutamisest tegelikult paras pähkel. Aga noh - tulemuseks on see, et nüüd ma saan vist enam-vähem aru kuidas "key"-d kasutatakse. Tõenäoliselt saaks siinseid päringud veel elegantsemaks teha, aga kui asja tööle sain, siis ei hoolinud enam suurt ;-) Ka siin pole html lehe enda kaunidusele suurt tähelepanu pööratud - pidasin andmete kättesaamist olulisemaks.
Failinimi Team Foundation-is on Items 2.xslt
Selle stiililehe töö tulemus on näha [[Anna, Alvar, Urmas Items2AsHTML|siin]]
<source lang="xml">
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="html" indent="yes"/>
  <xsl:key name="Category" match="/ItemList/Item/DefaultDimensions/Dimension/text()" use="."/>
  <xsl:template match="/">
    <html>
      <head>
        <title>Items by Category</title>
      </head>
      <body>
        <p>
          <h1>
            Items by Category
          </h1>
        </p>
        <!-- gather categories-->
        <xsl:for-each select="ItemList/Item/DefaultDimensions/Dimension[@DimensionCode='CATEGORY']/.">
          <xsl:sort select="." order="ascending"/>
          <xsl:variable name="CurrentCategory" select="."></xsl:variable>  
          <xsl:if test="generate-id(key('Category', $CurrentCategory)[1]) = generate-id(text())">
            <p>
              <xsl:value-of select="text()"/>
            </p>
            <table border="0">
              <tr>
                <th>Item No.</th>
                <th>Description</th>
                <th>UOM</th>
                <th>Unit Price</th>
                <th>Unit Cost</th>
                <th>Reorder Point</th>
                <th>Product Group</th>
              </tr>
              <xsl:for-each select="/ItemList/Item">
                <xsl:if test="DefaultDimensions/Dimension[@DimensionCode='CATEGORY']/.=$CurrentCategory">
                  <tr>
                    <td>
                      <xsl:value-of select="No"/>
                    </td>
                    <td>
                      <xsl:value-of select="Description"/>
                    </td>
                    <td>
                      <xsl:value-of select="BaseUnitofMeasure"/>
                    </td>
                    <td>
                      <xsl:value-of select="UnitPrice"/>
                    </td>
                    <td>
                      <xsl:value-of select="UnitCost"/>
                    </td>
                    <td>
                      <xsl:value-of select="ReorderPoint"/>
                    </td>
                    <xsl:for-each select="DefaultDimensions/Dimension">
                      <xsl:if test="@DimensionCode='PRODGROUP'">
                        <td>
                          <xsl:value-of select="."/>
                        </td>
                      </xsl:if>
                    </xsl:for-each>
                  </tr>
                  <p></p>
                </xsl:if>
              </xsl:for-each>
            </table>
            <p></p>
          </xsl:if>
        </xsl:for-each>  
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
</source>
==Retsensioon==
Viide retsenseeritavale tööle: https://wiki.itcollege.ee/index.php/Teine-meeskond
Töö formaalse poole pealt on täidetud kõik nõuded (norida võib ehk retsensiooni pikkusega, mis on ca 90 sõna nõutud 200 asemel).
Loodud on lihtne ja hästi struktureeritud XML fail, mille sisust saab kohe peale vaadates aru.
Mis puudutab ravikuuri loogikat, siis seda ei ole ilmselt otstarbekas kuupäevaselt paika panna (inimesed ei saa/taha kohe alustada ja kui olete märganud, siis öeldakse alati ravikuur stiilis: “x korda päevas y nädala jooksul"). Piisaks nimetada kuuri pikkus ja ravimi manustamise sagedus ja patsient otsustab ise, millal ta kuuriga alustab. Rakenduse poole pealt oleks ka lihtsam võtta XML’ist ravikuuri pikkus ja arvutada algus- ja lõpukuupäev (kui selleks tekib vajadus).
Sama kehtib ka sümptomite kohta. Nõutud on sümptomite alguse registreerimine kellaajalise täpsusega. See tekitab ilmselt olukorra, kus sisestatakse sümptomi ilmnemise kuupäev, kuid kellaaeg määratakse huupi, sest tõenäoliselt seda ei mäletata. Liigsed sammud, mida pole vaja.
Tõeväärtuste hoidmiseks on olemas <i>true/false</i> või 0 ja 1. Antud XML faili puhul kasutatakse string väärtuseid yes/no (attribuutide <i>isPrescriptionDrug</i>, <i>hasInsurance</i> ja <i>isPrivate</i> puhul)
Isukukoodi tüübiks on XSD failis määratud <i>integer</i>. Parem valik oleks ilmselt string. Isikukoodiga ei tehta arvutusi (puudub vajadus hoida seda <i>int</i> kujul). Kui Eestis on see hetkel tõesti puhtalt arvuline siis see ei kehti igalpool mujal (ega pruugi tulevikus ka Eestis kehtida). See aga tekitab olukorra, kus näiteks turisti isikukoodi on võimatu sisestada.
=Veebiteenus=
==<i>Business Case</i>==
Teenuse äriline idee on pakkuda tootmise- ja logistikattevõtetele võimalust tarbida, üldjuhul ERP süsteemides olevat, infot töötajate ülesannete kohta väljapool suhteliselt kallist ERP klientprogrammi ning kasutades selleks soovi korral ERP platvormist erinevate tehnoloogiale üles ehitatud tark- ja/või riistvara (ehk siis otse öeldes - midagi muud peale Windowsi). Teisiti sõnastades - võimaldav teenus hoida kokku ERP tarkvara kasutajalitsentsidelt ja/või kasutada keerulistes tingimustes spetsiaalset tark- ja riistvara.
Tavakasutaja saab näha ainult oma kasutajaimega seotud ülesandeid
Ülemus näeb oma alluvate ülesandeid
Superkasutaja saab näha kõiki
Süsteemi konfiguratsiooni hoitakse veebiteeusega alati kaasasolevas localdb andmebaasis
== Viited ==
Teenuse arendus asub Visualstudio.com aadressil https://urmas.visualstudio.com/DefaultCollection/XML%20for%20IT%20College/_versionControl#path=%24%2FXML+for+IT+College%2FCode%2FService+Application&_a=contents
Veebiteenus väljastab nüüd ka kenasti andmebaasist andmeid
Turvat veel ei ole

Latest revision as of 19:54, 21 May 2013

Võrgurakendused II: hajussüsteemide ehitamine

Kodutöö leht


Rühma liikmed:

Anna Lütsepp Alvar Väinola Urmas Pill

XML

TeamFoundation projekt (urmas.visualstudio.com): [1]

Faili kirjeldus

Võtsin xml tekitamise aluseks ühe majandustarkvarast pakutava demoandmetega kaupade tabeli. Sealt sai võetud mõned "huvitavamad" andmed ning lisatud ka setud tabelist kaupadega seotud dimensioonide vaikeväärtused. Tulemuseks on xml fail, mille nimeks on meie TeamFoundationi projektis Example1.xml

XML fail

<?xml version="1.0" encoding="utf-8" ?>
<ItemList>
  <TableID>27</TableID>
  <PageID>31</PageID>
  <DataTemplate>ITEM01</DataTemplate>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1000</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Bicycle</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">4000</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">350.594</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">0</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PRODUCTION</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">FINISHED</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>      
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1001</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Touring Bicycle</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">4000</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">350.594</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">0</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PRODUCTION</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">FINISHED</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1100</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Front Wheel</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">1000</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">129.671</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PRODUCTION</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">COMPONENT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>      
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1110</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Rim</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">1.05</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">200</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1120</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Spokes</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">2</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">5000</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1150</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Front Hub</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">500</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">12.441</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1151</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Axle Front Wheel</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">0.45</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1155</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Socket Front</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">0.77</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1160</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Tire</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">1.23</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1170</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Tube</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">1.75</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1200</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Back Wheel</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">1200</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">129.6815</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PRODUCTION</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">COMPONENT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1250</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Back Hub</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">1100</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">12.4515</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1251</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Axle Back Wheel</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">0.33</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1255</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Socket Back</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">0.9</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1300</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Chain Assy</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">800</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">13.1565</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PRODUCTION</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">COMPONENT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1310</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Chain</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">1.99</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1320</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Chain Wheel Front</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">4.66</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1330</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Chain Wheel Back</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">5.88</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1400</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Mudguard front</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">3.9</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1450</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Mudguard back</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">3.9</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1500</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Lamp</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">5.2</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1600</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Bell</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">2.7</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1700</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Brake</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">600</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">9.765</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1710</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Hand rear wheel Brake</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">4.5</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1720</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Hand front wheel Brake</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">4.8</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1800</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Handlebars</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">2.12</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
  <Item>
    <No ValidateField="1" ProcessingOrder="1">1850</No>
    <No2 ValidateField="1" ProcessingOrder="2"></No2>
    <Description ValidateField="1" ProcessingOrder="3">Saddle</Description>
    <Description2 ValidateField="1" ProcessingOrder="5"></Description2>
    <BaseUnitofMeasure ValidateField="1" ProcessingOrder="6">PCS</BaseUnitofMeasure>
    <UnitPrice ValidateField="1" ProcessingOrder="14">0</UnitPrice>
    <UnitCost ValidateField="1" ProcessingOrder="18">7.2</UnitCost>
    <ReorderPoint ValidateField="1" ProcessingOrder="27">100</ReorderPoint>
    <GrossWeight ValidateField="1" ProcessingOrder="34">0</GrossWeight>
    <NetWeight ValidateField="1" ProcessingOrder="35">0</NetWeight>
    <UnitVolume ValidateField="1" ProcessingOrder="37">0</UnitVolume>
    <TariffNo ValidateField="1" ProcessingOrder="40"></TariffNo>
    <DefaultDimensions>
      <Dimension GlobalDimension="1" DimensionCode="PROJECT">C800</Dimension>
      <Dimension GlobalDimension="2" DimensionCode="DEPARTMENT">PURCHASE</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="CATEGORY">RAWMAT</Dimension>
      <Dimension GlobalDimension="0" DimensionCode="PRODGROUP">BIKES</Dimension>
    </DefaultDimensions>
  </Item>
</ItemList>


XML schema (XSD)

Schema on püütud teha võimalikult täpseks - automaatselt tekitatud failile on lisatud vajalikud tüübikirjeldused ning vastavalt ka ära muudetud andmete tüübid.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="Code20">
    <xs:restriction base="xs:string">
      <xs:maxLength value="20"/>
      <xs:pattern value="([A-Z0-9])+"/>    
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="Code20B">
    <xs:restriction base="xs:string">
      <xs:maxLength value="20"/>
      <xs:pattern value="([A-Z0-9])*"/>    
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="Code10">
    <xs:restriction base="xs:string">
      <xs:maxLength value="10"/>
      <xs:pattern value="([A-Z0-9])+"/>    
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="Text50">
    <xs:restriction base="xs:string">
      <xs:maxLength value="50"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:element name="ItemList">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="TableID" type="xs:unsignedInt" />
        <xs:element name="PageID" type="xs:unsignedInt" />
        <xs:element name="DataTemplate" type="xs:string" />
        <xs:element maxOccurs="unbounded" name="Item">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="No" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Code20">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="No2" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Code20B">                    
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>                      
                </xs:complexType>
              </xs:element>
              <xs:element name="Description" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Text50">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="Description2" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Text50">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="BaseUnitofMeasure" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Code10">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="UnitPrice" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="UnitCost" maxOccurs="1">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="ReorderPoint">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="GrossWeight">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="NetWeight">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="UnitVolume">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:decimal">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="TariffNo">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="Code20B">
                      <xs:attribute name="ValidateField" type="xs:boolean" />
                      <xs:attribute name="ProcessingOrder" type="xs:unsignedShort" />
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:element name="DefaultDimensions">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="Dimension">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="Code20B">
                            <xs:attribute name="GlobalDimension" type="xs:unsignedByte" use="required" />
                            <xs:attribute name="DimensionCode" type="xs:string" use="required" />
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Style Sheet 1

Lihtne stiilileht, mis konverteerib Example XML-i tavaliseks tabeliks. Natuke erilisemaks teeb see, et ka kaks dimensiooni kaasatakse tavalisse tabelisse Failinimi Team Foundation-is on Items 1.xslt

Example1.xml ja Items 1.xslt koostöö on nähtav siin

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>Just item list</title>
      </head>
      <body>
        <p>
          <h1>
            Item list
          </h1>
        </p>
        <table border="0">
          <tr>
            <th>Item No.</th>    
            <th>Description</th>          
            <th>UOM</th>                
            <th>Unit Price</th>                
            <th>Unit Cost</th>                      
            <th>Reorder Point</th>
            <th>Category</th>      
            <th>Product Group</th>      
          </tr>
          <xsl:for-each select="ItemList/Item">
            <tr>
              <td><xsl:value-of select="No"/></td>      
              <td><xsl:value-of select="Description"/></td>
              <td><xsl:value-of select="BaseUnitofMeasure"/></td>
              <td><xsl:value-of select="UnitPrice"/></td>      
              <td><xsl:value-of select="UnitCost"/></td>
              <td><xsl:value-of select="ReorderPoint"/></td>
              <xsl:for-each select="DefaultDimensions/Dimension">
                <xsl:if test="@DimensionCode='CATEGORY'">
                  <td><xsl:value-of select="."/></td>                        
                </xsl:if>          
              </xsl:for-each>  
              <xsl:for-each select="DefaultDimensions/Dimension">
                <xsl:if test="@DimensionCode='PRODGROUP'">
                  <td><xsl:value-of select="."/></td>                        
                </xsl:if>          
              </xsl:for-each>  
            </tr>      
          </xsl:for-each>
        </table>
     </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Style Sheet 2

Sellega sai "natuke" vaeva nähtud. Unikaalsete rühma liikmete (antud faili puhul siis kategooriate) leidmine oli ilma Xpath 2.0-ita ja ilma igasuguse teadmiseta KEY konstruktsiooni kasutamisest tegelikult paras pähkel. Aga noh - tulemuseks on see, et nüüd ma saan vist enam-vähem aru kuidas "key"-d kasutatakse. Tõenäoliselt saaks siinseid päringud veel elegantsemaks teha, aga kui asja tööle sain, siis ei hoolinud enam suurt ;-) Ka siin pole html lehe enda kaunidusele suurt tähelepanu pööratud - pidasin andmete kättesaamist olulisemaks. Failinimi Team Foundation-is on Items 2.xslt

Selle stiililehe töö tulemus on näha siin

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="html" indent="yes"/>
  <xsl:key name="Category" match="/ItemList/Item/DefaultDimensions/Dimension/text()" use="."/>
  <xsl:template match="/">
    <html>
      <head>
        <title>Items by Category</title>
      </head>
      <body>
        <p>
          <h1>
            Items by Category
          </h1>
        </p>		
        <!-- gather categories-->
        <xsl:for-each select="ItemList/Item/DefaultDimensions/Dimension[@DimensionCode='CATEGORY']/.">
          <xsl:sort select="." order="ascending"/>
          <xsl:variable name="CurrentCategory" select="."></xsl:variable>		  
          <xsl:if test="generate-id(key('Category', $CurrentCategory)[1]) = generate-id(text())">
            <p>
              <xsl:value-of select="text()"/>
            </p>
            <table border="0">
              <tr>
                <th>Item No.</th>
                <th>Description</th>
                <th>UOM</th>
                <th>Unit Price</th>
                <th>Unit Cost</th>
                <th>Reorder Point</th>
                <th>Product Group</th>
              </tr>
              <xsl:for-each select="/ItemList/Item">
                <xsl:if test="DefaultDimensions/Dimension[@DimensionCode='CATEGORY']/.=$CurrentCategory">
                  <tr>
                    <td>
                      <xsl:value-of select="No"/>
                    </td>
                    <td>
                      <xsl:value-of select="Description"/>
                    </td>
                    <td>
                      <xsl:value-of select="BaseUnitofMeasure"/>
                    </td>
                    <td>
                      <xsl:value-of select="UnitPrice"/>
                    </td>
                    <td>
                      <xsl:value-of select="UnitCost"/>
                    </td>
                    <td>
                      <xsl:value-of select="ReorderPoint"/>
                    </td>
                    <xsl:for-each select="DefaultDimensions/Dimension">
                      <xsl:if test="@DimensionCode='PRODGROUP'">
                        <td>
                          <xsl:value-of select="."/>
                        </td>
                      </xsl:if>
                    </xsl:for-each>
                  </tr>
                  <p></p>
                </xsl:if>
              </xsl:for-each>
            </table>
            <p></p>
          </xsl:if>
        </xsl:for-each>		  
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Retsensioon

Viide retsenseeritavale tööle: https://wiki.itcollege.ee/index.php/Teine-meeskond

Töö formaalse poole pealt on täidetud kõik nõuded (norida võib ehk retsensiooni pikkusega, mis on ca 90 sõna nõutud 200 asemel).

Loodud on lihtne ja hästi struktureeritud XML fail, mille sisust saab kohe peale vaadates aru.

Mis puudutab ravikuuri loogikat, siis seda ei ole ilmselt otstarbekas kuupäevaselt paika panna (inimesed ei saa/taha kohe alustada ja kui olete märganud, siis öeldakse alati ravikuur stiilis: “x korda päevas y nädala jooksul"). Piisaks nimetada kuuri pikkus ja ravimi manustamise sagedus ja patsient otsustab ise, millal ta kuuriga alustab. Rakenduse poole pealt oleks ka lihtsam võtta XML’ist ravikuuri pikkus ja arvutada algus- ja lõpukuupäev (kui selleks tekib vajadus).

Sama kehtib ka sümptomite kohta. Nõutud on sümptomite alguse registreerimine kellaajalise täpsusega. See tekitab ilmselt olukorra, kus sisestatakse sümptomi ilmnemise kuupäev, kuid kellaaeg määratakse huupi, sest tõenäoliselt seda ei mäletata. Liigsed sammud, mida pole vaja.

Tõeväärtuste hoidmiseks on olemas true/false või 0 ja 1. Antud XML faili puhul kasutatakse string väärtuseid yes/no (attribuutide isPrescriptionDrug, hasInsurance ja isPrivate puhul)

Isukukoodi tüübiks on XSD failis määratud integer. Parem valik oleks ilmselt string. Isikukoodiga ei tehta arvutusi (puudub vajadus hoida seda int kujul). Kui Eestis on see hetkel tõesti puhtalt arvuline siis see ei kehti igalpool mujal (ega pruugi tulevikus ka Eestis kehtida). See aga tekitab olukorra, kus näiteks turisti isikukoodi on võimatu sisestada.


Veebiteenus

Business Case

Teenuse äriline idee on pakkuda tootmise- ja logistikattevõtetele võimalust tarbida, üldjuhul ERP süsteemides olevat, infot töötajate ülesannete kohta väljapool suhteliselt kallist ERP klientprogrammi ning kasutades selleks soovi korral ERP platvormist erinevate tehnoloogiale üles ehitatud tark- ja/või riistvara (ehk siis otse öeldes - midagi muud peale Windowsi). Teisiti sõnastades - võimaldav teenus hoida kokku ERP tarkvara kasutajalitsentsidelt ja/või kasutada keerulistes tingimustes spetsiaalset tark- ja riistvara.

Tavakasutaja saab näha ainult oma kasutajaimega seotud ülesandeid Ülemus näeb oma alluvate ülesandeid Superkasutaja saab näha kõiki

Süsteemi konfiguratsiooni hoitakse veebiteeusega alati kaasasolevas localdb andmebaasis

Viited

Teenuse arendus asub Visualstudio.com aadressil https://urmas.visualstudio.com/DefaultCollection/XML%20for%20IT%20College/_versionControl#path=%24%2FXML+for+IT+College%2FCode%2FService+Application&_a=contents

Veebiteenus väljastab nüüd ka kenasti andmebaasist andmeid Turvat veel ei ole