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

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

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

int main() {

 try {

  XalanInitializer init; // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Xalan

  XalanTransformer xslt; // ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΎΡ€ XSLT.

  XSLTResultTarget html("animals.html"); // Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ xslt.

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

  XSLTInputSource xml("animals.xml");

  XalanParsedSource* parsedXml = 0;

  if (xslt.parseSource(xml, parsedXml) != 0) {

   cout << "xml error: " << xslt.getLastError() << "\n";

  }

  // ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ стилСй.

  XSLTInputSource xsl("animals.xsl");

  XalanCompiledStylesheet* compiledXsl = 0;

  if (xslt.compileStylesheet(xsl, compiledXsl) != 0) {

   cout << "xml error: " << xslt.getLastError() << "\n";

  }

  // Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅.

  if (xslt.transform(xml, xsl, html)) {

   cout << "xml error: " << xslt.getLastFrror() << "\n";

  }

 } 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;

 }

}

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

Π Π΅Ρ†Π΅ΠΏΡ‚ 14.8.

14.8. ВычислСниС XPath-выраТСния

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

ВрСбуСтся ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ парсСром, ΠΏΡƒΡ‚Π΅ΠΌ вычислСния XPath-выраТСния.

РСшСниС

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Xalan. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ синтаксичСский Π°Π½Π°Π»ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° xalanc::XalanDocument. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ экзСмпляры XalanSourceTreeInit, XalanSourceTreeDOMSupport ΠΈ XalanSourceTreeParserLiaison, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ опрСдСляСтся Π² пространствС ΠΈΠΌΠ΅Π½ xalanc.

#include <xercesc/framework/LocalFileInputSource.hpp>

#include <xalanc/XalanSourceTree/XalarSourceTreeDOMSupport.hpp>

#include <xalanc/XalanSourceTree/XalanSourceTreeInit.hpp>

#include <xalanc/XalanSourceTree/XalanSourceTreeParserLiaison.hpp>

...


int main() {

 ...

 // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ подсистСму XalanSourceTree

 XalarSourceTreeInit init;

 XalanSourceTreeDOMSupport support;

 // Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ доступа ΠΊ парсСру

 XalanSourceTreeParserLiaison liaison(support);

 // ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ DOMSupport ΠΊ ParserLiaison

 support.setParserLiaison(&liaison);

 LocalFileInputSource src(мСсто-располоТСния-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°);

 XalanDocument* doc = liaison.ParseXMLStream(doc);

 ...

}

МоТно ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ парсСр Xerces DOM для получСния указатСля Π½Π° DOMDocument, ΠΊΠ°ΠΊ это сдСлано Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.14, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ экзСмпляры XercesDOMSupport, XercesParserLiaison ΠΈ XercesDOMWrapperParsedSource, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… опрСдСляСтся Π² пространствС ΠΈΠΌΠ΅Π½ xalanc для получСния указатСля Π½Π° XalanDocument, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρƒ DOMDocument.

#include <xercesc/dom/DOM.hpp>

#include <xalanc/XalanTransformer/XercesDOMWrapperParsedSource.hpp>

#include <xalanc/XercesParserLiaison/XercesParserLiaison.hpp>

#include <xalanc/XercesParserLiaison/XercesDOMSupport.hpp>

...


int main() {

 ...

 DOMDocument* doc = ...;

 XercesDOMSupport support;

 XercesParserLiaison liaison(support);

 XercesDOMWrapperParsedSource src(doc, liaison, support);

 XalanDocument* xalanDoc = src.getDocument();

 ...

}

На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ шагС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠ·Π΅Π», Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Ρ€ΠΎΠ»ΡŒ ΡƒΠ·Π»Π° контСкста ΠΏΡ€ΠΈ вычислСнии выраТСния XPath. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ интСрфСйса DOM Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XalanDocument. БконструируйтС XPathEvaluator для вычислСния выраТСния XPath ΠΈ XalanDocumentPrefixResolver для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ прСфиксов пространств ΠΈΠΌΠ΅Π½ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ XML. НаконСц, Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ XPathEvaluator::evaluate(), пСрСдавая Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² DOMSupport, контСкстный ΡƒΠ·Π΅Π», XPath-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ PrefixResolver. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния выраТСния возвращаСтся Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° XObjectPtr; Ρ‚ΠΈΠΏ допустимых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ этим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… XPath, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° getType().

НапримСр, ΠΏΡƒΡΡ‚ΡŒ трСбуСтся ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ список ΠΈΠΌΠ΅Π½ ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ… ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° animals.xml, прСдставлСнного Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.1. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, выполняя синтаксичСский Π°Π½Π°Π»ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ вычисляя XPath-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ animalList/animal/name/child::text() с использованиСм корня Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Π² качСствС контСкстного ΡƒΠ·Π»Π°. Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.23.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 14.23. ВычислСниС Π₯Π Π°th-выраТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Xalan

#include <cstddef> // size_t

#include <exception>

#include <iostream> // cout

#include <xercesc/dom/DOM.hpp>

#include <xercesc/parsers/XercesDOMParser.hpp>

#include <xercesc/sax2/DefaultHandler.hpp>

#include <xercesc/util/PlatformUtils.hpp>

#include <xalanc/DOMSupport/XalanDocumentPrefixResolver.hpp>

#include <xalanc/XalanTransformer/XercesDOMWrapperParsedSource.hpp>

#include <xalanc/XercesParserLiaison/XercesParserLiaison.hpp>

#include <xalanc/XercesParserLiaison/XercesDOMSupport.hpp>

#include <xalanc/XPath/XObject.hpp>

#include <xalanc/XPath/XPathEvaluator.hpp>

#include "animal.hpp"

#include "xerces_strings.hpp"


using namespace std;

using namespace xercesc;

using namespace xalanc;


// Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° RAII, которая ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ парсСр ΠΈ процСссор XPath, освобоТдая

// рСсурсы ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· области видимости

class XPathInitializer {

public:

 XPathInitializer() {

 XMLPlatformUtils::Initialize();

 XPathEvaluator::initialize();

}

~XPathInitializer() {

 XpathEvaluator::terminate();

 XMLPlatformUtils::Terminate();

}

private:

 // Π—Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ присваиваниС

 XPathInitializer(const XPathInitializer&);

 XPathInitializer& operator=(const XPathInitializer&);

};


// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ увСдомлСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…

class CircusErrorHandler : public DefaultHandler {

public:

 void error(const SAXParseException& e) {

  throw runtime_error(toNative(e.getMessage()));

 }

 void fatalError(const SAXParseException& e) { error(e); }

};


int main() {

 try {

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

  XPathInitializer init;

  XercesDOMParser parser;

  // Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ошибок

  CircusErrorHandler error;

  parser.setErrorHandler(&error);

  // Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· animals.xml.

  parser.parse(fromNative("animals.xml").c_str());

  DOMDocument* doc = parser.getDocument();

  DOMElement* animalList = doc->getDocumentElement();

  // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ XalanDocument Π½Π° основС doc.

  XercesDOMSupport support;

  XercesParserLiaison liaison(support);

  XercesDOMWrapperParsedSource src(doc, liaison, support);

  XalanDocument* xalanDoc = src.getDocument();

  // Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ XPath-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для получСния списка

  // тСкстовых ΡƒΠ·Π»ΠΎΠ², содСрТащих ΠΈΠΌΠ΅Π½Π° ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ…

  XPathEvaluator evaluator;

  XalanDocumentPrefixResolver resolver(xalanDoc);

  XercesString xpath =

   fromNative("animalList/animal/name/child::text()");

  XObjectPtr result =

   evaluator.evaluate(

    support,       // ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° DOM

    xalanDoc,      // контСкстный ΡƒΠ·Π΅Π»

    xpath.c_str(), // XPath-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

    resolver);     // функция Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ пространства ΠΈΠΌΠ΅Π½

  const NodeRefListBase& nodeset = result->nodeset();

  // ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ списка ΡƒΠ·Π»ΠΎΠ² ΠΈ Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠΌΠ΅Π½ ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ…

  for (size_t i = 0, len = nodeset.getLength(); i < len; ++i) {

   const XMLCh* name = nodeset.item(i)->getNodeValue().c_str();

   std::cout << toNative(name) << "\n";

  }

 } catch (const DOMException& e) {

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

  return EXIT_FAILURE;

 } catch (const exception& e) {

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

  return EXIT_FAILURE;

 }

}

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

XPath β€” это язык поиска ΠΏΠΎ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ (pattern matching language), ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для извлСчСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² XML. Основная конструкция XPath β€” Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ (path expression) ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ иСрархичСский синтаксис ссылок Π½Π° элСмСнты, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ тСкстовыС ΡƒΠ·Π»Ρ‹ Π½Π° основС использования ΠΈΡ… ΠΈΠΌΠ΅Π½, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², тСкстового содСрТимого, ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ наслСдования ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… свойств. ΠšΡ€ΠΎΠΌΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ ΡƒΠ·Π»ΠΎΠ² язык XPath ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ строки, числа ΠΈ Π±ΡƒΠ»Π΅Π²Ρ‹ значСния. XPath вСрсии 2.0, которая Π² настоящСС врСмя Π½Π΅ поддСрТиваСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Xalan, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π°ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ модСль Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π½Π° рСкомСндациях XML Schema. (Π‘ΠΌ. Ρ€Π΅Ρ†Π΅ΠΏΡ‚ 14.5.)

XPath-выраТСния Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Π² контСкстС ΡƒΠ·Π»Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ контСкстным ΡƒΠ·Π»ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ связанной с Π½ΠΈΠΌ конструкции, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, parent, child ΠΈ descendant. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 14.23 я ΡƒΠΊΠ°Π·Π°Π» ΠΊΠΎΡ€Π΅Π½ΡŒ (root) Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML Π² качСствС контСкстного ΡƒΠ·Π»Π°; этот ΡƒΠ·Π΅Π» являСтся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌΡƒ элСмСнту Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊ любой инструкции ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ коммСнтариям Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня. ΠŸΡ€ΠΈ вычислСнии выраТСния с использованиСм ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π² качСствС контСкстного ΡƒΠ·Π»Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ animalList/animal/name/child::text() соотвСтствуСт всСм тСкстовым ΡƒΠ·Π»Π°ΠΌ, Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ элСмСнтам name, Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ элСмСнтом ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся animal, ΠΈ Ρ‡ΡŒΠΈΠΌ Β«Π΄Π΅Π΄ΡƒΡˆΠΊΠΎΠΉΒ» являСтся элСмСнт animalList.