XSLT

Поделись знанием:
Перейти к: навигация, поиск

XSLT (eXtensible Stylesheet Language Transformations) — язык преобразования XML-документов. Спецификация XSLT входит в состав XSL и является рекомендацией W3C.

При применении таблицы стилей XSLT, состоящей из набора шаблонов, к XML-документу (исходное дерево) образуется конечное дерево, которое может быть сериализовано в виде XML-документа, XHTML-документа (только для XSLT 2.0), HTML-документа или простого текстового файла. Правила выбора (и, отчасти, преобразования) данных из исходного дерева пишутся на языке запросов XPath.

XSLT имеет множество различных применений, в основном в области веб-программирования и генерации отчётов. Одной из задач, решаемых языком XSLT, является отделение данных от их представления, как часть общей парадигмы MVC (англ. Model-view-controller). Другой стандартной задачей является преобразование XML-документов из одной XML-схемы в другую.





История

XSLT разработан рабочей группой XSL Консорциума Всемирной паутины.

Версия 1.0 была одобрена в качестве рекомендации 16 ноября 1999 года. После выхода первой версии начались работы над версией 1.1, но в 2001 году они были прекращены, а рабочая группа XSL присоединилась к рабочей группе XQuery для совместной работы над XPath 2.0. Впоследствии XPath 2.0 послужил основой при разработке XSLT версии 2.0.

Версия 2.0 была одобрена в качестве рекомендации 24 января 2007 года. Несмотря на то, что версия 2.0 является последней, версия 1.0 продолжает использоваться очень широко.

Процесс выполнения XSLT-преобразования

В процессе выполнения XSLT-преобразования задействованы:

  • один или несколько входных XML-документов;
  • одна или несколько таблиц стилей XSLT;
  • XSLT-процессор;
  • один или несколько выходных документов.

В простейшем случае XSLT-процессор получает на входе два документа — входной XML-документ и таблицу стилей XSLT — и создает на их основе выходной документ.

XSLT и XPath

XSLT использует язык XPath для доступа к отдельным частям входного XML-документа и для организации вычислений.

XSLT 1.0 использует XPath 1.0, а XSLT 2.0 использует XPath 2.0.

Примеры

Трансформация из XML в XML

Исходный XML-документ:

<?xml version="1.0"?>
<persons>
  <person username="MP123456">
    <name>Иван</name>
    <surname>Иванов</surname>
  </person>
  <person username="PK123456">
    <name>Пётр</name>
    <surname>Петров</surname>
  </person>
</persons>

Таблица XSLT-стилей (преобразования):

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="www.w3.org/1999/XSL/Transform" version="1.0">

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

    <xsl:template match="persons">
        <transform>
            <xsl:apply-templates/>
        </transform>
    </xsl:template>

    <xsl:template match="person">
        <record>
            <xsl:apply-templates select="@*|*"/>
        </record>
    </xsl:template>

    <xsl:template match="@username">
        <username>
            <xsl:value-of select="."/>
        </username>
    </xsl:template>

    <xsl:template match="name">
        <fullname>
            <xsl:apply-templates/>
            <xsl:apply-templates select="following-sibling::surname" mode="fullname"/>
        </fullname>
    </xsl:template>

    <xsl:template match="surname"/>

    <xsl:template match="surname" mode="fullname">
        <xsl:text> </xsl:text>
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

Результирующий XML-документ:

<?xml version="1.0" encoding="UTF-8"?>
<transform>
   <record>
      <username>MP123456</username>
      <fullname>Иван Иванов</fullname>
   </record>
   <record>
      <username>PK123456</username>
      <fullname>Пётр Петров</fullname>
   </record>  
</transform>

Трансформация из XML в XHTML

Входной XML-документ:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="my-style.xsl"?>

<domains>
    <sun.com ownedBy="Sun Microsystems Inc.">
        <host>
            www
            <use>World Wide Web site</use>
        </host>
        <host>
            java
            <use>Java info</use>
        </host>
    </sun.com>
    
    <w3.org ownedBy="The World Wide Web Consortium">
        <host>
            www
            <use>World Wide Web site</use>
        </host>
        <host>
            validator
            <use>web developers who want to get it right</use>
        </host>
    </w3.org>
</domains>

Стиль для XSLT-трансформации:

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

<xsl:stylesheet version="1.0" 
        xmlns:xsl="www.w3.org/1999/XSL/Transform" 
        xmlns="www.w3.org/1999/xhtml">
    <xsl:output method="xml" indent="yes"
        doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
        doctype-system="www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
    
    <!--XHTML document outline--> 
    <xsl:template match="/">
        <html xmlns="www.w3.org/1999/xhtml" xml:lang="en" lang="en">
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
                <title>test1</title>
                <style type="text/css">
                    h1          { padding: 10px; padding-width: 100%; background-color: silver }
                    td, th      { width: 40%; border: 1px solid silver; padding: 10px }
                    td:first-child, th:first-child  { width: 20% } 
                    table       { width: 650px }
                </style>
            </head>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
    
    <!--Table headers and outline-->
    <xsl:template match="domains/*">
        <h1><xsl:value-of select="@ownedBy"/></h1>
        <p>The following host names are currently in use at
          <strong><xsl:value-of select="local-name(.)"/></strong>
        </p>
        <table>
            <tr><th>Host name</th><th>URL</th><th>Used by</th></tr>
            <xsl:apply-templates/>
        </table>
    </xsl:template>
    
    <!--Table row and first two columns-->
    <xsl:template match="host">
        <!--Create variable for 'url', as it's used twice-->
        <xsl:variable name="url" select=
            "normalize-space(concat('', normalize-space(node()), '.', local-name(..)))"/>
        <tr>
            <td><xsl:value-of select="node()"/></td>
            <td><a href="{$url}"><xsl:value-of select="$url"/></a></td>
            <xsl:apply-templates select="use"/>
        </tr>
    </xsl:template>

    <!--'Used by' column-->
    <xsl:template match="use">
        <td><xsl:value-of select="."/></td>
    </xsl:template>
        
</xsl:stylesheet>

XHTML, который мы получаем на выходе (пробелы были добавлены для ясности):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <meta content="text/html;charset=UTF-8" http-equiv="Content-Type" />
    <title>test1</title>
    <style type="text/css">
      h1          { padding: 10px; padding-width: 100%; background-color: silver }
      td, th      { width: 40%; border: 1px solid silver; padding: 10px }
      td:first-child, th:first-child  { width: 20% } 
      table       { width: 650px }
    </style>
  </head>
  <body>
    <h1>Sun Microsystems Inc.</h1>
    <p>The following host names are currently in use at <strong>sun.com</strong></p>
    <table>
        <tr>
          <th>Host name</th>
          <th>URL</th>
          <th>Used by</th>
        </tr>
        <tr>
          <td>www</td>
          <td><a href="www.sun.com">www.sun.com</a></td>
          <td>World Wide Web site</td>
        </tr>
        <tr>
          <td>java</td>
          <td><a href="java.sun.com">java.sun.com</a></td>
          <td>Java info</td>
        </tr>
    </table>
    
    <h1>The World Wide Web Consortium</h1>
    <p>The following host names are currently in use at <strong>w3.org</strong></p>
    <table>
      <tr>
        <th>Host name</th>
        <th>URL</th>
        <th>Used by</th>
      </tr>
      <tr>
        <td>www</td>
        <td><a href="www.w3.org">www.w3.org</a></td>
        <td>World Wide Web site</td>
      </tr>
      <tr>
        <td>validator</td>
        <td><a href="validator.w3.org">validator.w3.org</a></td>
        <td>web developers who want to get it right</td>
      </tr>
    </table>
  </body>
</html>

На выходе не всегда получится обязательно правильный XHTML. В XSLT 2.0 это исправлено — добавлен метод вывода 'XHTML', наряду с 'HTML', который уже существовал в XSLT 1.0.

Применение правил шаблонов

Язык XSLT является декларативным, а не процедурным. Вместо определения последовательности исполняемых операторов, этот язык определяет правила, которые будут применяться во время преобразования. Само преобразование ведется по фиксированному алгоритму.

В первую очередь XSLT процессор разбирает файл преобразования и строит XML дерево входного файла. Затем он ищет шаблон, который лучше всего подходит для корневого узла и вычисляет содержимое найденного шаблона. Инструкции в каждом шаблоне могут либо напрямую говорить XSLT процессору «создай здесь такой-то тег», либо говорить «обработай другие узлы по тому же правилу, что и корневой узел».

Более подробно этот алгоритм, в чём-то нетривиальный, описывается ниже, хотя многие из его экзотических деталей опущены.

Каждый XSLT-процессор должен выполнить следующие шаги для подготовки к трансформации.

  1. Прочитать таблицу стилей XSLT с помощью XML-парсера и перевести его содержимое в дерево узлов (дерево таблицы стилей), согласно модели данных XPath. Синтаксические ошибки «времени компиляции» определяются на этой стадии. Таблицы стилей могут быть модульными, поэтому все включения (инструкции xsl:include, xsl:import) также будут обработаны на этой стадии с целью объединить все шаблонные правила и иные элементы из других таблиц стилей в единое дерево таблицы стилей.
  2. Прочитать входные данные XML с помощью XML-парсера, перевести его содержимое в дерево узлов (исходное дерево), согласно модели данных XPath. XML-документ может ссылаться на другие XML-источники с помощью вызова функций document(). Эти вызовы обычно обрабатываются во время выполнения, так как их расположение может являться вычисляемым, а вызовы соответствующих функций могут не происходить вовсе. (Пример выше не ссылается на какие-либо другие документы.)
  3. Удалить пустые узлы из таблицы стилей XSLT, кроме тех, которые являются потомками от элементов xsl:text. Это позволяет исключить появление «лишних» пробелов.
  4. Удалить пустые текстовые узлы из исходного дерева, если инструкции xsl:strip-space присутствуют в исходном документе. Это позволяет исключить появление «лишних» пробелов. (Пример выше не использует эту возможность.)
  5. Пополнить XSLT-дерево тремя правилами, которые предоставляют поведение по умолчанию для любых типов узлов, которые могут быть встречены при обработке. Первое правило — для обработки корневого узла; оно даёт инструкцию процессору обработать каждого потомка корневого узла. Второе правило — для любых текстовых узлов или узлов атрибутов; он даёт команду процессору сделать копию этого узла в результирующем дереве. Третье правило — для всех узлов комментария и узлов-инструкций обработки; никакой операции не производится. Шаблоны, явно заданные в XSLT, могут перекрывать часть или все шаблоны-правила, заданные по умолчанию. Если шаблон не содержит явных правил, встроенные правила будут применены для рекурсивного обхода исходного дерева и только текстовые узлы будут скопированы в результирующее дерево (узлы атрибутов не будут достигнуты, так как они не являются «детьми» их родительских узлов). Полученный таким образом результат обычно нежелателен, так как он является просто конкатенацией всех текстовых фрагментов из исходного XML-документа.

Затем процессор проделывает следующие шаги для получения и сериализации результирующего дерева.

  1. Создаёт корневой узел результирующего дерева.
  2. Обрабатывает корневой узел исходного дерева. Процедура обработки узла описана ниже.
  3. Сериализует результирующее дерево, если необходимо, согласно подсказкам, описанным инструкцией xsl:output.

При обработке узла производятся следующие действия.

  1. Производится поиск наиболее подходящего шаблона правила. Это достигается проверкой соответствия шаблона (который является выражением XPath) для каждого правила, указывая узлы, для которых правило может быть применено. Каждому шаблону процессором назначается относительный приоритет и старшинство для облегчения разрешения конфликтов. Порядок шаблонных правил в таблице стилей также может помочь разрешению конфликтов между шаблонами, которые соответствуют одинаковым узлам, но это не оказывает влияния на порядок, в котором узлы будут обрабатываться.
  2. Template rule contents are instantiated. Элементы в пространстве имён XSLT (обычно имеющие префикс xsl:) трактуются как инструкции и имеют специальную семантику, которая указывает на то, как они должны интерпретироваться. Одни предназначены для добавления узлов в результирующее дерево, другие являются управляющими конструкциями. Не XSLT-элементы и текстовые узлы, обнаруженные в правиле, копируются, «дословно», в результирующее дерево. Комментарии и управляющие инструкции игнорируются.

Инструкция xsl:apply-templates при её обработке приводит к выборке и обработке нового набора узлов. Узлы идентифицируются с помощью выражения XPath. Все узлы обрабатываются в том порядке, в котором они содержатся в исходном документе.

XSLT расширяет библиотеку функций XPath и позволяет определять XPath-переменные. Эти переменные имеют разную область видимости в таблице стилей, в зависимости от того, где они были определены и их значения могут задаваться за пределами таблицы стилей. Значения переменных не могут быть изменены во время обработки.

Хотя эта процедура может показаться сложной, однако она делает XSLT по возможностям похожей на другие языки web-шаблонов. Если таблица стилей состоит из единственного правила, предназначенного для обработки корневого узла, в результат просто копируется всё содержимое шаблона, а XSLT-инструкции (элементы 'xsl:…') заменяются вычисляемым содержимым. XSLT предлагает даже специальный формат («literal result element as stylesheet») для таких простых, одношаблонных трансформаций. Однако, возможность определять отдельные шаблоны и правила сильно увеличивает гибкость и эффективность XSLT, особенно при генерации результата, который очень похож на исходный документ.

См. также

Напишите отзыв о статье "XSLT"

Литература

  • Тидуэлл Д. XSLT. 2-е издание = XSLT, 2nd Edition. — СПб: Символ-Плюс, 2009. — 960 с. — 1200 экз. — ISBN 978-5-93286-150-9.
  • Мангано С. XSLT. Сборник рецептов = XSLT Cookbook: Solutions and Examples for XML and XSLT Developers, 2nd Edition. — СПб: BHV, 2008. — 864 с. — ISBN 978-5-9775-0292-4.
  • Кэй М. XSLT. Справочник программиста. 2-е издание = XSLT, Programmer’s Reference, 2nd Edition. — СПб: Символ-Плюс, 2002. — 1016 с. — 2000 экз. — ISBN 5-93286-039-1.
  • Холзнер С. XSLT. Библиотека программиста. 2-е издание = Inside XSLT. — СПб: Питер, 2002. — 544 с. — 3 экз. — ISBN 5-94723-271-5.

Ссылки

  • [www.w3.org/TR/xslt XSLT 1.0. Рекомендация W3C]  (англ.)
  • [www.w3.org/TR/xslt20/ XSLT 2.0. Рекомендация W3C]  (англ.)
  • [www.w3.org/TR/xslt-30/ XSLT 3.0. Рабочий черновик]  (англ.)
  • [zvon.org/xxl/XSLTutorial/Output_rus/index.htm Учебные материалы по XSLT на zvon.org]
  • [xmlhack.ru/books/xslt/ Выдержки] из книги Алексея Валикова «[www.books.ru/shop/books/22090 Технология XSLT]».
  • [www.raleigh.ru/XML/XSLTutorial/contents.htm XSLT в примерах]
  • [data2type.de/en/xml-xslt-xslfo/xslt/ XSLT introduction and reference]


Отрывок, характеризующий XSLT

Она встала и оправила волосы, которые у нее всегда, даже и теперь, были так необыкновенно гладки, как будто они были сделаны из одного куска с головой и покрыты лаком.
– Что, случилось что нибудь? – спросила она. – Я уже так напугалась.
– Ничего, всё то же; я только пришел поговорить с тобой, Катишь, о деле, – проговорил князь, устало садясь на кресло, с которого она встала. – Как ты нагрела, однако, – сказал он, – ну, садись сюда, causons. [поговорим.]
– Я думала, не случилось ли что? – сказала княжна и с своим неизменным, каменно строгим выражением лица села против князя, готовясь слушать.
– Хотела уснуть, mon cousin, и не могу.
– Ну, что, моя милая? – сказал князь Василий, взяв руку княжны и пригибая ее по своей привычке книзу.
Видно было, что это «ну, что» относилось ко многому такому, что, не называя, они понимали оба.
Княжна, с своею несообразно длинною по ногам, сухою и прямою талией, прямо и бесстрастно смотрела на князя выпуклыми серыми глазами. Она покачала головой и, вздохнув, посмотрела на образа. Жест ее можно было объяснить и как выражение печали и преданности, и как выражение усталости и надежды на скорый отдых. Князь Василий объяснил этот жест как выражение усталости.
– А мне то, – сказал он, – ты думаешь, легче? Je suis ereinte, comme un cheval de poste; [Я заморен, как почтовая лошадь;] а всё таки мне надо с тобой поговорить, Катишь, и очень серьезно.
Князь Василий замолчал, и щеки его начинали нервически подергиваться то на одну, то на другую сторону, придавая его лицу неприятное выражение, какое никогда не показывалось на лице князя Василия, когда он бывал в гостиных. Глаза его тоже были не такие, как всегда: то они смотрели нагло шутливо, то испуганно оглядывались.
Княжна, своими сухими, худыми руками придерживая на коленях собачку, внимательно смотрела в глаза князю Василию; но видно было, что она не прервет молчания вопросом, хотя бы ей пришлось молчать до утра.
– Вот видите ли, моя милая княжна и кузина, Катерина Семеновна, – продолжал князь Василий, видимо, не без внутренней борьбы приступая к продолжению своей речи, – в такие минуты, как теперь, обо всём надо подумать. Надо подумать о будущем, о вас… Я вас всех люблю, как своих детей, ты это знаешь.
Княжна так же тускло и неподвижно смотрела на него.
– Наконец, надо подумать и о моем семействе, – сердито отталкивая от себя столик и не глядя на нее, продолжал князь Василий, – ты знаешь, Катишь, что вы, три сестры Мамонтовы, да еще моя жена, мы одни прямые наследники графа. Знаю, знаю, как тебе тяжело говорить и думать о таких вещах. И мне не легче; но, друг мой, мне шестой десяток, надо быть ко всему готовым. Ты знаешь ли, что я послал за Пьером, и что граф, прямо указывая на его портрет, требовал его к себе?
Князь Василий вопросительно посмотрел на княжну, но не мог понять, соображала ли она то, что он ей сказал, или просто смотрела на него…
– Я об одном не перестаю молить Бога, mon cousin, – отвечала она, – чтоб он помиловал его и дал бы его прекрасной душе спокойно покинуть эту…
– Да, это так, – нетерпеливо продолжал князь Василий, потирая лысину и опять с злобой придвигая к себе отодвинутый столик, – но, наконец…наконец дело в том, ты сама знаешь, что прошлою зимой граф написал завещание, по которому он всё имение, помимо прямых наследников и нас, отдавал Пьеру.
– Мало ли он писал завещаний! – спокойно сказала княжна. – Но Пьеру он не мог завещать. Пьер незаконный.
– Ma chere, – сказал вдруг князь Василий, прижав к себе столик, оживившись и начав говорить скорей, – но что, ежели письмо написано государю, и граф просит усыновить Пьера? Понимаешь, по заслугам графа его просьба будет уважена…
Княжна улыбнулась, как улыбаются люди, которые думают что знают дело больше, чем те, с кем разговаривают.
– Я тебе скажу больше, – продолжал князь Василий, хватая ее за руку, – письмо было написано, хотя и не отослано, и государь знал о нем. Вопрос только в том, уничтожено ли оно, или нет. Ежели нет, то как скоро всё кончится , – князь Василий вздохнул, давая этим понять, что он разумел под словами всё кончится , – и вскроют бумаги графа, завещание с письмом будет передано государю, и просьба его, наверно, будет уважена. Пьер, как законный сын, получит всё.
– А наша часть? – спросила княжна, иронически улыбаясь так, как будто всё, но только не это, могло случиться.
– Mais, ma pauvre Catiche, c'est clair, comme le jour. [Но, моя дорогая Катишь, это ясно, как день.] Он один тогда законный наследник всего, а вы не получите ни вот этого. Ты должна знать, моя милая, были ли написаны завещание и письмо, и уничтожены ли они. И ежели почему нибудь они забыты, то ты должна знать, где они, и найти их, потому что…
– Этого только недоставало! – перебила его княжна, сардонически улыбаясь и не изменяя выражения глаз. – Я женщина; по вашему мы все глупы; но я настолько знаю, что незаконный сын не может наследовать… Un batard, [Незаконный,] – прибавила она, полагая этим переводом окончательно показать князю его неосновательность.
– Как ты не понимаешь, наконец, Катишь! Ты так умна: как ты не понимаешь, – ежели граф написал письмо государю, в котором просит его признать сына законным, стало быть, Пьер уж будет не Пьер, а граф Безухой, и тогда он по завещанию получит всё? И ежели завещание с письмом не уничтожены, то тебе, кроме утешения, что ты была добродетельна et tout ce qui s'en suit, [и всего, что отсюда вытекает,] ничего не останется. Это верно.
– Я знаю, что завещание написано; но знаю тоже, что оно недействительно, и вы меня, кажется, считаете за совершенную дуру, mon cousin, – сказала княжна с тем выражением, с которым говорят женщины, полагающие, что они сказали нечто остроумное и оскорбительное.
– Милая ты моя княжна Катерина Семеновна, – нетерпеливо заговорил князь Василий. – Я пришел к тебе не за тем, чтобы пикироваться с тобой, а за тем, чтобы как с родной, хорошею, доброю, истинною родной, поговорить о твоих же интересах. Я тебе говорю десятый раз, что ежели письмо к государю и завещание в пользу Пьера есть в бумагах графа, то ты, моя голубушка, и с сестрами, не наследница. Ежели ты мне не веришь, то поверь людям знающим: я сейчас говорил с Дмитрием Онуфриичем (это был адвокат дома), он то же сказал.
Видимо, что то вдруг изменилось в мыслях княжны; тонкие губы побледнели (глаза остались те же), и голос, в то время как она заговорила, прорывался такими раскатами, каких она, видимо, сама не ожидала.
– Это было бы хорошо, – сказала она. – Я ничего не хотела и не хочу.
Она сбросила свою собачку с колен и оправила складки платья.
– Вот благодарность, вот признательность людям, которые всем пожертвовали для него, – сказала она. – Прекрасно! Очень хорошо! Мне ничего не нужно, князь.
– Да, но ты не одна, у тебя сестры, – ответил князь Василий.
Но княжна не слушала его.
– Да, я это давно знала, но забыла, что, кроме низости, обмана, зависти, интриг, кроме неблагодарности, самой черной неблагодарности, я ничего не могла ожидать в этом доме…
– Знаешь ли ты или не знаешь, где это завещание? – спрашивал князь Василий еще с большим, чем прежде, подергиванием щек.
– Да, я была глупа, я еще верила в людей и любила их и жертвовала собой. А успевают только те, которые подлы и гадки. Я знаю, чьи это интриги.
Княжна хотела встать, но князь удержал ее за руку. Княжна имела вид человека, вдруг разочаровавшегося во всем человеческом роде; она злобно смотрела на своего собеседника.
– Еще есть время, мой друг. Ты помни, Катишь, что всё это сделалось нечаянно, в минуту гнева, болезни, и потом забыто. Наша обязанность, моя милая, исправить его ошибку, облегчить его последние минуты тем, чтобы не допустить его сделать этой несправедливости, не дать ему умереть в мыслях, что он сделал несчастными тех людей…
– Тех людей, которые всем пожертвовали для него, – подхватила княжна, порываясь опять встать, но князь не пустил ее, – чего он никогда не умел ценить. Нет, mon cousin, – прибавила она со вздохом, – я буду помнить, что на этом свете нельзя ждать награды, что на этом свете нет ни чести, ни справедливости. На этом свете надо быть хитрою и злою.
– Ну, voyons, [послушай,] успокойся; я знаю твое прекрасное сердце.
– Нет, у меня злое сердце.
– Я знаю твое сердце, – повторил князь, – ценю твою дружбу и желал бы, чтобы ты была обо мне того же мнения. Успокойся и parlons raison, [поговорим толком,] пока есть время – может, сутки, может, час; расскажи мне всё, что ты знаешь о завещании, и, главное, где оно: ты должна знать. Мы теперь же возьмем его и покажем графу. Он, верно, забыл уже про него и захочет его уничтожить. Ты понимаешь, что мое одно желание – свято исполнить его волю; я затем только и приехал сюда. Я здесь только затем, чтобы помогать ему и вам.
– Теперь я всё поняла. Я знаю, чьи это интриги. Я знаю, – говорила княжна.
– Hе в том дело, моя душа.
– Это ваша protegee, [любимица,] ваша милая княгиня Друбецкая, Анна Михайловна, которую я не желала бы иметь горничной, эту мерзкую, гадкую женщину.
– Ne perdons point de temps. [Не будем терять время.]
– Ax, не говорите! Прошлую зиму она втерлась сюда и такие гадости, такие скверности наговорила графу на всех нас, особенно Sophie, – я повторить не могу, – что граф сделался болен и две недели не хотел нас видеть. В это время, я знаю, что он написал эту гадкую, мерзкую бумагу; но я думала, что эта бумага ничего не значит.
– Nous у voila, [В этом то и дело.] отчего же ты прежде ничего не сказала мне?
– В мозаиковом портфеле, который он держит под подушкой. Теперь я знаю, – сказала княжна, не отвечая. – Да, ежели есть за мной грех, большой грех, то это ненависть к этой мерзавке, – почти прокричала княжна, совершенно изменившись. – И зачем она втирается сюда? Но я ей выскажу всё, всё. Придет время!


В то время как такие разговоры происходили в приемной и в княжниной комнатах, карета с Пьером (за которым было послано) и с Анной Михайловной (которая нашла нужным ехать с ним) въезжала во двор графа Безухого. Когда колеса кареты мягко зазвучали по соломе, настланной под окнами, Анна Михайловна, обратившись к своему спутнику с утешительными словами, убедилась в том, что он спит в углу кареты, и разбудила его. Очнувшись, Пьер за Анною Михайловной вышел из кареты и тут только подумал о том свидании с умирающим отцом, которое его ожидало. Он заметил, что они подъехали не к парадному, а к заднему подъезду. В то время как он сходил с подножки, два человека в мещанской одежде торопливо отбежали от подъезда в тень стены. Приостановившись, Пьер разглядел в тени дома с обеих сторон еще несколько таких же людей. Но ни Анна Михайловна, ни лакей, ни кучер, которые не могли не видеть этих людей, не обратили на них внимания. Стало быть, это так нужно, решил сам с собой Пьер и прошел за Анною Михайловной. Анна Михайловна поспешными шагами шла вверх по слабо освещенной узкой каменной лестнице, подзывая отстававшего за ней Пьера, который, хотя и не понимал, для чего ему надо было вообще итти к графу, и еще меньше, зачем ему надо было итти по задней лестнице, но, судя по уверенности и поспешности Анны Михайловны, решил про себя, что это было необходимо нужно. На половине лестницы чуть не сбили их с ног какие то люди с ведрами, которые, стуча сапогами, сбегали им навстречу. Люди эти прижались к стене, чтобы пропустить Пьера с Анной Михайловной, и не показали ни малейшего удивления при виде их.
– Здесь на половину княжен? – спросила Анна Михайловна одного из них…
– Здесь, – отвечал лакей смелым, громким голосом, как будто теперь всё уже было можно, – дверь налево, матушка.
– Может быть, граф не звал меня, – сказал Пьер в то время, как он вышел на площадку, – я пошел бы к себе.
Анна Михайловна остановилась, чтобы поровняться с Пьером.
– Ah, mon ami! – сказала она с тем же жестом, как утром с сыном, дотрогиваясь до его руки: – croyez, que je souffre autant, que vous, mais soyez homme. [Поверьте, я страдаю не меньше вас, но будьте мужчиной.]
– Право, я пойду? – спросил Пьер, ласково чрез очки глядя на Анну Михайловну.
– Ah, mon ami, oubliez les torts qu'on a pu avoir envers vous, pensez que c'est votre pere… peut etre a l'agonie. – Она вздохнула. – Je vous ai tout de suite aime comme mon fils. Fiez vous a moi, Pierre. Je n'oublirai pas vos interets. [Забудьте, друг мой, в чем были против вас неправы. Вспомните, что это ваш отец… Может быть, в агонии. Я тотчас полюбила вас, как сына. Доверьтесь мне, Пьер. Я не забуду ваших интересов.]
Пьер ничего не понимал; опять ему еще сильнее показалось, что всё это так должно быть, и он покорно последовал за Анною Михайловной, уже отворявшею дверь.