Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 128

Автор Π”. БтСфСнс

Аналогично для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML Π½Π° соотвСтствиС схСмы с использованиСм DOMBuilder Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ подтвСрТдСния достовСрности ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

DOMBuilder* parser = ...;

parser->setFeature(XMLUni::fgDOMNamespaces, true);

parser->setFeature(XMLUni::fgDOMValidation, true);

parser->setFeature(XMLUni::fgXercesSchema, true);

Для подтвСрТдСния соотвСтствия Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° внСшнСй схСмС с использованиСм DOMBuilder установитС свойство XMLUni::fgXercesSchemaExternalSchemaLocation ΠΈΠ»ΠΈ XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ мСста располоТСния схСмы.

НапримСр, ΠΏΡƒΡΡ‚ΡŒ трСбуСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ animals.xml ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.1, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ схСму ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.16. Один ΠΈΠ· способов Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ссылки Π½Π° схСму Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ animals.xml, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.17. ПослС этого Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс SAX2, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.13, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ DOM, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.14 с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΉ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.15.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.16. Π‘Ρ…Π΅ΠΌΠ° animals.xsd для Ρ„Π°ΠΉΠ»Π° animals.xml

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

<!- Π‘Ρ…Π΅ΠΌΠ° для ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ… Ρ†ΠΈΡ€ΠΊΠ° Feldman Family Circus -->

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"

 elementFormDefault="qualified">

 <xsd:element name="animalList">

  <xsd:complexType>

   <xsd:sequence>

    <xsd:element name="animal" minOccurs="0" maxOccurs="unbounded">

     <xsd:complexType>

       <xsd:sequence>

        <xsd:element name="name" type="xsd:string" />

        <xsd:element name="species" type="xsd:string"/>

        <xsd:element name="dateOfBirth" type="xsd:date"/>

        <xsd:element name="veterinarian" type="contact"/>

        <xsd:element name="trainer" type="contact"/>

       </xsd:sequence>

      </xsd:complexType>

     </xsd:element>

    </xsd:sequence>

   </xsd:complexType>

  </xsd:element>

 <xsd:complexType name="contact">

  <xsd:attribute name="name" type="xsd:string"/>

  <xsd:attribute name="phone" type="phone"/>

 </xsd:complexType>

 <xsd:simpleType name="phone">

  <xsd:restriction base="xsd:string">

   <xsd:pattern value="\(\d{3}\)\d{3}-\d{4}"/>

  </xsd:restriction>

 </xsd:simpleType>

</xsd:schema>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.17. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» animals.xml, содСрТащий ссылку Π½Π° схСму

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

<!- Π–ΠΈΠ²ΠΎΡ‚Π½Ρ‹Π΅ Ρ†ΠΈΡ€ΠΊΠ° Feldman Family Circus со схСмой -->

<animalList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:noNamespaceSchemalocation="animals.xsd">

<!- Π’Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.1 -->

</animalList>

МоТно ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ: ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ссылку Π½Π° схСму ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ подтвСрТдСния соотвСтствия Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° внСшнСй схСмС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.18 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ использовании парсСра DOM.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.18. ΠŸΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ соотвСтствия Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML внСшнСй схСмС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ DOM

/*

 * Π’Π΅ ΠΆΠ΅ самыС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ #include, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ использовались Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.14

 */

using namespace std;

using namespace xercesc;


/*

 * ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ XercesInitializer, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.8,

 * ΠΈ CircusErorHandler, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.7

 */

int main() {

 try {

  // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Xerces ΠΈ ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ парсСр DOM.

  XercesInitializer init;

  XercesDOMParser parser;

  // Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ

  parser.setValidationScheme(XercesDOMParser::Val_Always);

  parser.setDoSchema(true); parser.setDoNamespaces(true);

  parser.setExternalNoNamespaceSchemaLocation(

   fromNative("animals.xsd").c_str());

  // Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ошибок для получСния ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ

  // Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡΡ… схСмы

  CircusErrorHandler handler;

  parser.setErrorHandler(&handler);

  // Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ соотвСтствиС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°

  // схСмС.

  parser parse("animals.xml");

 } catch (const SAXException& e) {

  cout << "xml error: " << toNative(e.getMessage()) << "\n";

  return EXIT_FAILURE;

 } catch (const XMLException& e) {

  cout << "xml error: " << toNative(e.getMessage()) << "\n";

  return EXIT_FAILURE;

 } catch (const exception& e) {

  cout << e.what() << "\n";

  return EXIT_FAILURE;

 }

}

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Подобно опрСдСлСниям DTD, рассмотрСнным Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π΅, схСмы Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ ограничСния Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ XML. Π‘Ρ…Π΅ΠΌΠ° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для опрСдСлСния подмноТСства ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ сформированных Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Ρ… для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ области. Однако схСмы ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Ρ€ΠΈ отличия ΠΎΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ DTD. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, концСпция DTD ΠΈ связанноС с Π½Π΅ΠΉ понятиС подтвСрТдСния достовСрности (validity) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² самой спСцификации XML, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ схСмы описаны Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ спСцификации β€” Π² рСкомСндациях XML Schema. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, сами схСмы ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ сформированными Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ XML, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ для описания ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ DTD ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ синтаксис, продСмонстрированный Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.11. Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, схСмы сущСствСнно Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹, Ρ‡Π΅ΠΌ опрСдСлСния DTD. Из-Π·Π° Π΄Π²ΡƒΡ… послСдних ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΉ считаСтся, Ρ‡Ρ‚ΠΎ схСмы прСвосходят опрСдСлСния DTD.

НапримСр, Π² DTD ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.11 ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ лишь ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ элСмСнты veterinarian ΠΈΠΌΠ΅Π»ΠΈ Ρ€ΠΎΠ²Π½ΠΎ Π΄Π²Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, name ΠΈ phone, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… состоят ΠΈΠ· символов. Напротив, схСма Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.16 Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° phone, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, соотвСтствовало рСгулярному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ \(\d{3}\)\d{3}-\d{4}, Ρ‚.Π΅. Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ ΠΈΠΌΠ΅Π»ΠΎ Π²ΠΈΠ΄ (ddd)xxx-dddd, Π³Π΄Π΅ d ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой Ρ†ΠΈΡ„Ρ€ΠΎΠΉ. Аналогично обстоит Π΄Π΅Π»ΠΎ с элСмСнтом dateOfBirth: Ссли Π² DTD ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот элСмСнт ΠΈΠΌΠ΅Π» тСкстовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ схСма Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ тСкстовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π»ΠΎ Π²ΠΈΠ΄ yyyy-mm-dd, Π³Π΄Π΅ yyyy задаСтся Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0001 Π΄ΠΎ 9999, mm β€” ΠΎΡ‚ 01 Π΄ΠΎ 12, a dd β€” ΠΎΡ‚ 01 Π΄ΠΎ 31.

Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ эти Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ограничСния создаСт большоС прСимущСство, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ позволяСт Ρ‡Π°ΡΡ‚ΡŒ программистской Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° парсСр.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΆΠ΅

Π Π΅Ρ†Π΅ΠΏΡ‚ 14.5.

14.7. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XSLT

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

ВрСбуСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ стилСй XSLT.

РСшСниС

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Xalan. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, сконструируйтС экзСмпляр ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€Π° XSTL xalanc::XalanTransformer. Π—Π°Ρ‚Π΅ΠΌ сконструируйтС Π΄Π²Π° экзСмпляра xalanc::XSLTInputSource (ΠΎΠ΄ΠΈΠ½ для Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ для вашСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ стилСй) ΠΈ экзСмпляр Ρ…Π°lanc::XSLTResultTarget для Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ прСобразования. НаконСц, Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ XSLT transform(), пСрСдавая Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Π²Π° экзСмпляра XSLTInputSource ΠΈ ΠΎΠ΄ΠΈΠ½ XSLTResultTarget.

НапримСр, прСдставим, Ρ‡Ρ‚ΠΎ трСбуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π΅Π±-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ список ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ… Ρ†ΠΈΡ€ΠΊΠ° ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.1. Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XSLT Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.19 приводится Ρ‚Π°Π±Π»ΠΈΡ†Π° стилСй XSLT, которая Π½Π° Π²Ρ…ΠΎΠ΄Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ animals.xml, ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ HTML, содСрТащий Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ описываСтся ΠΎΠ΄Π½ΠΎ ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ΅ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΠΈΡ‡ΠΊΠΈ, Π²ΠΈΠ΄Π°, Π΄Π°Ρ‚Ρ‹ роТдСния, Π²Π΅Ρ‚Π΅Ρ€ΠΈΠ½Π°Ρ€Π° ΠΈ дрСссировщика. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.20 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Xalan, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ стилСй для Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° animals.xml. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.21 приводится HTML, сгСнСрированный ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 14.20; этот HTML ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ восприятия.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.19. Π’Π°Π±Π»ΠΈΡ†Π° стилСй для animals.xml

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

<!- Π’Π°Π±Π»ΠΈΡ†Π° стилСй для ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ… Ρ†ΠΈΡ€ΠΊΠ° Feldman Family Circus -->

<xsl:stylesheet versions="1.1"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="html"/>


 <xsl:template match="/">

  <html>

   <head>

    <title>Feldman Family Circus Animals</title>

   </head>

   <body>

    <h1>Feldman Family Circus Animals</h1>

     <table cellpadding="3" border="1">

      <tr>

       <th>Name</th>

       <th>Species</th>

       <th>Date of Birth</th>

       <th>Veterinarian</th>

       <th>Trainer</th>

      </tr>

      <xsl:apply-templates match="animal">

     </xsl:apply-templates>

    </table>

   </body>

  </html>

 </xsl:template>


 <xsl:template match="animal">

  <tr>

   <td><xsl:value-of select="name"/></td>

   <td><xsl:value-of select="species"/></td>

   <td><xsl:value-of select="dateOfBirth"/></td>

   <xsl:apply-templates select="veterinarian"/>

   <xsl:apply-templates select="trainer"/>

  </tr>

 </xsl:template>


 <xsl:template match="veterinarian|trainer">

  <td>

   <table>

    <tr>