Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #28, МАРТ 2003 г.

Обнаженная теория об XML.

DarkSergeant

Спецвыпуск Xakep, номер #028, стр. 028-056-3


Возьмем простенький XML-документ:

<Users>

<User id=”1”>

<Name>Вася</Name>

<Role>программист</Role>

<Role>дворник</Role>

<Role>потребитель денег</Role>

<Salary>200</Salary>

</User>

<User id=”2”>

<Name>Михаил Петрович</Name>

<Role>шеф</Role>

<Role>раздатчик денег</Role>

<Salary>2000</Salary>

</User>

<User id=”3”>

<Name>Маня</Name>

<Role>секретарша</Role>

<Role>массажистка шефа</Role>

<Role>потребитель денег</Role>

<Salary>1000</Salary>

</User>

<User id=”4”>

<Name>Юра</Name>

<Role>программист</Role>

<Role>потребитель денег</Role>

<Salary>500</Salary>

</User>

</Users>

и представим, что мы хотим узнать сколько получает массажистка шефа. Через XPath это делается в одну строчку: /Users/User[Role=”массажистка шефа”]/Salary. Или мы хотим узнать как зовут второго чела: /Users/User[1]/Name. Даже если мы хотим узнать сколько шеф должен платить сотрудникам, это все равно будет одна строчка: sum(/Users/User[Role=”потребитель денег”]/Salary).

Как можно заметить формат XPath-а очень прост: указываем путь к интересующему нас элементу (также, как и в файловой системе), а в квадратных скобках указываем условие-фильтр. Обращаю твое внимание на то, что XPath выбирает все элементы, которые удовлетворяют данному условию. На запрос /Users/User[Salary<1000] мы получим 2 элемента полностью описывающих юзера:

<User id=”1”>

<Name>Вася</Name>

<Role>программист</Role>

<Role>дворник</Role>

<Role>потребитель денег</Role>

<Salary>200</Salary>

</User>

<User id=”4”>

<Name>Юра</Name>

<Role>программист</Role>

<Role>потребитель денег</Role>

<Salary>500</Salary>

</User>

Если бы мы уточнили запрос /Users/User[Salary<1000]/Name, то на выходе были бы не целые юзеры, а только их имена.

<Name>Вася</Name>

<Name>Юра</Name>

Все вышеприведенные запросы начинались с корневого элемента, но если запрос начинается с двух слэшей, то ищутся элементы на произвольном уровне вложенности. Так запрос //Role вернет список всех обязанностей наших юзеров. XPath не производит оптимизации ответа, поэтому Role «программист» будет выведена 2 раза.

В качестве домашнего задания напиши XPath-выражение, которое возвращает имя любовницы шефа.

XSL – Расширяемый Язык Стиля

Изначально XSL разрабатывался для преобразования XML-я в HTML, но сейчас XSL используется для произвольной трансформации одного XML-я в другой. XSL является XML-ным документом, корневой элемент которого должен быть xsl:stylesheet. Далее в этот корневой элемент вставляются шаблоны - <xsl:template match="//User"></xsl:template>, где в атрибуте match указывается XPath для каких элементов будет выполняться данный шаблон. Внутри элемента xsl:template пишется то, на что мы хотим заменить выбранные элементы. Например, следующий XSL:

Назад на стр. 028-056-2  Содержание  Вперед на стр. 028-056-4