parser

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

 

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

относительные пути в parser:// и функция document()

Вячеслав 31.05.2006 19:33

Установлен парсер 3.2.1sp1 (compiled on i386-pc-win32)
Код можно прям скопировать как есть, запустить и поковыряться:
# index.html
@auto[]
$response:content-type[text/xml]

@main[]
$doc[^xdoc::load[parser://dynamic_doc/root.xml]]
$transformed_doc[^doc.transform[template.xsl]]
^transformed_doc.string[]

@dynamic_doc[url]
$result[<include href="next/doc.xml" base="$url"/>]
<!-- template.xsl -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="depth" select="2"/>

<xsl:template match="include">
<!-- атрибут base используется только как отладочная информация, сам документ запрашивается по относительному пути -->
<doc base="{@base}">
    <xsl:if test="$depth > 0">
        <xsl:apply-templates select="document(@href)">
            <xsl:with-param name="depth" select="$depth - 1"/>
        </xsl:apply-templates>
    </xsl:if>
</doc>
</xsl:template>

</xsl:stylesheet>
Приведенный код в таком виде работает как положено. Но если аргумент функции document() будет браться не напрямую, а вычисляться, например:
document(string(@href))
document(substring(сoncat('asdf', @href), 5)))
...
то документ почему-то уже запрашивается не по протоколу parser:, а пытается считаться с диска. Такое поведение случается только тогда, когда указан относительный путь, если указывать протокол, "домен" и базовый путь, то никаких сюрпризов не будет.

Не знаю уж, фича это или нет, но для меня такое исключение из правил, мягко говоря, не самое приятное известие, т.к. никакие танцы с бубном вокруг этой проблемы не помогли. (Кстати говоря, меня несколько удивило, почему нельзя задать относительный путь такого вида: parser:next/doc.xml, т.е. с явным указанием протокола, так это возможно для относительных ссылок внутри html-страниц: <a href="http:../docs/">[url="http:../docs/"]документация[/url]</a> )

В принципе, в некоторых случаях, переключиться с относительного пути по протоколу parser на относительный файловый путь с помощью string($path) было бы и удобно, особенно учитывая то, что абсолютные пути в xslt приходится указывать от корня диска. Но это уж очень неочевидная фича, к тому же она не дополняет, а перекрывает стандартное поведение, поэтому мне кажется, что все-таки здесь ошибка.