如何使用Exist-DB和Xquery与Xpath调用函数

时间:2014-03-05 19:20:42

标签: xml function xpath xquery exist-db

我发现有些人会考虑函数中的调用函数,但我收到了这个错误:

NotFound No template function found for call app:PokazRodzica

但首先。这是我的主要功能

    declare function app:WyswietlAkweny($node as node(), $model as map(*), $nazwa as xs
    :string?) {

        <table border="1" width="100%">
        <th>Podrzędne</th><th>Nazwa</th><th>Typ</th><th>Powierzchnia</th><th>Edycja</th>
        {
            for $x in doc('/db/Dane/akweny.xml/')//akwen
            let $nazwa := $x/nazwa,
                $typ := $x/typ,
                $powierzchnia := $x/powierzchnia
                return <tr>
(:~ THIS DOSENT WORK :)
                    <th><a href="{app:PokazRodzica($nazwa)}"><img src="/exist/apps/Obrazki/lupa.jpg" alt="Podrzedny" /> KLIK</a></th>
                    <th bgcolor="#F46978">{$nazwa}</th>
                    <th>{$typ}</th>
                    <th>{$powierzchnia}</th>
                    <th>Edytuj</th>
                    </tr>
        }
        </table>
    };

这是我的功能当我按下图像时想要运行的内容

declare function app:PokazRodzica($nazwa1 as xs:string?)  {


<table border="1" width="100%">
<th>Podrzędne</th><th>Nazwa</th><th>Typ</th><th>Powierzchnia</th><th>Edycja</th>
{
let $nodes := doc('/db/Dane/akweny.xml')//akweny[parent::akwen/nazwa=$nazwa1]
for $x in $nodes/*
let $nazwa := $x/nazwa/text()
let $typ := $x/typ/text()
let $powierzchnia := $x/powierzchnia/text()
    return 
       <tr>
        <th><img src="/exist/apps/Obrazki/lupa.jpg" alt="Podrzedny" /> {count($nazwa/text())} KLIK</th>
        <th bgcolor="#F46978">{$nazwa}</th>
        <th>{$typ}</th>
        <th>{$powierzchnia}</th>
        <th>Edytuj</th>
        </tr>
}</table>
};

这是我的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<akweny>
    <akwen>
        <nazwa>Atlantycki</nazwa>
        <typ>ocean</typ>
        <powierzchnia>106450</powierzchnia>
        <akweny>
            <akwen>
                <nazwa>Północne</nazwa>
                <typ>morze</typ>
                <powierzchnia>750</powierzchnia>
            </akwen>
            <akwen>
                <nazwa>Batyckie</nazwa>
                <typ>morze</typ>
                <powierzchnia>386</powierzchnia>
                <akweny>
                    <akwen>
                        <nazwa>Botnicka</nazwa>
                        <typ>zatoka</typ>
                        <powierzchnia>117</powierzchnia>
                    </akwen>
<akweny>
                        <akwen>
                        <nazwa>Botnicka</nazwa>
                        <typ>zatoka3</typ>
                        <powierzchnia>11777</powierzchnia>
                        </akwen>
</akweny>
                </akweny>
            </akwen>
        </akweny>
    </akwen>
    <akwen>
        <nazwa>Spokojny</nazwa>
        <typ>ocean</typ>
        <powierzchnia>179700</powierzchnia>
    </akwen>
</akweny>

我这样调用MAIN函数:

<p class="app:WyswietlAkweny"/>

我正在尝试找到任何 akweny ,其父母 akwen 与nazwa子女,子女和无穷大,其值为$ nazwa1。

1 个答案:

答案 0 :(得分:1)

我想我现在明白了这个问题。我怀疑您希望调用此函数,并在用户在查看网页时单击此锚标记时返回其值:

<a href="{app:PokazRodzica($nazwa)}">

这不是正在发生的事情。当您输出此锚标记时,AVT({})中的任何内容都将在返回之前进行评估。因此,这会调用您引用的函数,并将其输出字面存储在该属性中。您需要的是引用一个端点,以便浏览器可以通过端点调用该函数:

<a href="/call-app-PokazRodzica.xqy?value={$nazwa}">

然后在端点脚本call-app-PokazRodzica.xqy中,接受value参数,并调用您的函数:

app:PokazRodzica($value-param)

现在,当您的用户点击锚点时,它将调用端点并将值传递给它。然后,浏览器将返回端点调用的结果。