Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Вячеслав 31.05.2006 22:01
Оказывается, если в предыдущем примере написать вот так:<xsl:apply-templates select="document(string(@href), .)">
то все будет работать нормально.Функция document() может принимать набор узлов в качестве второго аргумента, и в этом случае первый узел (в порядке следования в документе) из этого набора используется в качестве базового URI, относительно которого разрешаются относительные URI, заданные в первом аргументе.Для меня остается загадкой следующее: какую информацию о базовом пути может предоставить узел, если он ее ни в каком виде не содержит, да и вообще почему нужно передавать параметром именно узел, а не строку с путем? Ну я бы еще понял, если бы у это узла или его предков был бы атрибут xml:base, но его же нет. Более того, относительные пути по протоколу parser: разрешаются средствами самого парсера, в чем и заключается большое удобсто, т.к. не нужно ничего явно прописывать.
<!-- см. пример, опубликованный ранее --> <!-- результаты одинаковые, используется протокол parser: --> <xsl:apply-templates select="document(@href)"> <xsl:apply-templates select="document(string(@href), .)"> <!-- а так происходит запрос к файлу, хрен знает почему: --> <xsl:apply-templates select="document(string(@href))">Теперь, если вглядеться, можно заметить, что в первых двух вызовах в функцию передаются ноды, а в последнем - строка. Скорее всего, в этом и есть какой-то подвох.