Книга: Технология XSLT

Использование ключей в нескольких документах

Использование ключей в нескольких документах

Ключи, определенные в преобразовании, могут использоваться для выбора узлов в различных обрабатываемых документах. Функция key возвращает узлы, которые принадлежат текущему документу, то есть документу, содержащему текущий узел. Значит, для того, чтобы выбирать узлы из внешнего документа, необходимо сделать текущим узлом один из узлов этого внешнего документа. Контекстный документ может быть легко изменен элементом xsl:for-each, например, для того, чтобы текущим документом стал документ a.xml, достаточно написать

<xsl:for-each select="document('а.xml')">
 <!-- Теперь текущим документом стал документ а.xml -->
</xsl:for-each>

Пример

Предположим, что нам нужно выбрать объекты, принадлежащие источнику a, причем принадлежность объектов определена в двух внешних документах, a.xml и b.xml.

Листинг 8.22. Входящий документ

<source name="a"/>

Листинг 8.23. Документ a.xml

<items>
 <item source="a" name="A"/>
 <item source="b" name="B"/>
 <item source="a" name="C"/>
 <item source="c" name="D"/>
</items>

Листинг 8.24. Документ b.xml

<items>
 <item source="b" name="E"/>
 <item source="b" name="F"/>
 <item source="c" name="G"/>
 <item source="a" name="H"/>
</items>

Листинг 8.25. Преобразование

<xsl:stylesheet
 version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:key name="src" match="item" use="@source"/>
 <xsl:template match="source">
  <xsl:variable name="name" select="@name"/>
  <xsl:copy>
   <xsl:for-each select="document('a.xml')|document('b.xml')">
    <xsl:copy-of select="key('src', $name)"/>
   </xsl:for-each>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

Листинг 8.26. Выходящий документ

<source>
 <item source="a" name="A"/>
 <item source="a" name="C"/>
 <item source="a" name="H"/>
</source>

Оглавление книги


Генерация: 1.155. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз