ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° 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>