Книга: Технология XSLT
Вызов document(string, node-set)
Разделы на этой странице:
Вызов document(string, node-set)
URI, которые передаются функции document
, могут быть как абсолютными, так и относительными, например document('doc.xml')
возвратит корень документа doc.xml
, находящегося в том же каталоге, что и само преобразование.
Функция document
позволяет менять "точку отсчета" относительных URI. Если в качестве второго аргумента функции document передано множество узлов, то относительные идентификаторы ресурсов будут отсчитываться от базового адреса первого (в порядке просмотра документа) узла этого множества.
Базовым URI узла дерева является:
? если элемент или инструкция по обработке принадлежит внешней сущности, базовым URI соответствующего узла будет URI внешней сущности;
? иначе базовым URI является URI документа;
? базовым URI текстового узла, узла атрибута, комментария или пространства имен является базовый URI родительского элемента.
Поясним вышесказанное на примерах.
Конструкция
<xsl:copy-of select="document('doc.xml')"/>
копирует в выходящий документ doc.xml
, находящийся в одном каталоге вместе с преобразованием.
Несмотря на то, что в следующем определении xsl:for-each
меняет контекст, document('doc.xml')
все равно возвращает корень документа doc.xml
, находящегося в одном с преобразованием каталоге:
<xsl:for-each select="document('a/data.xml')">
<xsl:copy-of select="document('doc.xml')"/>
</xsl:for-each>
В следующей конструкции document('doc.xml', /)
копирует документ a/doc.xml,
поскольку в качестве базового URI используется URI корня документа a/data.xml
:
<xsl:for-each select="document('a/data.xml')">
<xsl:copy-of select="document('doc.xml', /)"/>
</xsl:for-each>
Того же самого эффекта можно достичь следующим образом:
<xsl:copy-of select="document('doc.xml', document('a/data.xml'))"/>
В следующей конструкции за базовый URI опять принимается URI самого преобразования (вернее, его корневого узла):
<xsl:copy-of select="document('doc.xml', document(''))"/>
Протестируем теперь все это вместе в одном преобразовании.
Листинг 8.63. Преобразование
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:copy-of select="document('doc.xml')"/>
<xsl:for-each select="document('a/data.xml')">
<xsl:copy-of select="document('doc.xml')"/>
</xsl:for-each>
<xsl:for-each select="document('a/data.xml')">
<xsl:copy-of select="document('doc.xml', /)"/>
</xsl:for-each>
<xsl:copy-of select="document('doc.xml', document('a/data.xml'))"/>
<xsl:for-each select="document('a/data.xml')">
<xsl:copy-of select="document('doc.xml', document(''))"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Листинг 8.64. Документ doc.xml
<doc>doc.xml</doc>
Листинг 8.65. Документ a/doc.xml
<doc>a/doc.xml</doc>
Листинг 8.66. Выходящий документ
<doc>doc.xml</doc>
<doc>doc.xml</doc>
<doc>a/doc.xml</doc>
<doc>a/doc.xml</doc>
<doc>doc.xml</doc>
- Функция document
- Вызов document(node-set, node-set)
- Вызов document(node-set)
- Вызов document(string)
- SET TERM больше не нужен в isql
- Conventions used in this document
- Chapter 8. Saving and restoring large rule-sets
- Appendix H. GNU Free Documentation License
- Why this document was written
- Terms used in this document
- Using Double Quotes to Resolve Variables in Strings with Embedded Spaces
- Kernel setup