parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Upd: заставил-таки работать! Вопрос снят.

Вячеслав 31.05.2006 22:01

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

Ну да ладно, главное, что работает. Самое удивительно открытие для меня за сегодня можно компактно записать в 3 строчки:
<!-- см. пример, опубликованный ранее -->

<!-- результаты одинаковые, используется протокол parser: --> 
<xsl:apply-templates select="document(@href)">
<xsl:apply-templates select="document(string(@href), .)">

<!-- а так происходит запрос к файлу, хрен знает почему: -->
<xsl:apply-templates select="document(string(@href))">
Теперь, если вглядеться, можно заметить, что в первых двух вызовах в функцию передаются ноды, а в последнем - строка. Скорее всего, в этом и есть какой-то подвох.

Хм, перечитав написанное, становится уже все гораздо понятнее. Наверное, так оно и есть, что парсер, создавая документ при вызове parser://dynamic_doc/ задает для него xml:base, который потом и будет считываться из функции document(), для чего ей и нужно передавать именно нод (или в первом аргументе, если он один, или во втором).

Опс, теперь даже не нужно спрашивать у PAF'а, почему метод, вызываемый через parser://method/ может возвращать только строку, и почему не может сразу объект xdoc, что в некоторых случаях было бы удобно. Видимо как раз из-за этой фичи с относительными путями, и невозможностью потом поменять у созданного документа xml:base.

Все, че-та я тут расфлудился...