Как манипулировать путями к файлам - PullRequest
0 голосов
/ 13 января 2020

Я знаю, что это похоже на дубликат, и я уверен, что это более или менее ... Однако, это действительно беспокоит меня, и я не могу ничего постить раньше:

Я создаю цифровое издание, использующее TEI, XML, XSLT, (и, вероятно, существует DB, возможно, я переключаюсь на узел / javascript).

Я создал php -функцию, которая должна преобразовывать каждый файл в указанном каталоге в html. (Мой xsl-файл работает хорошо)

declare function app:XMLtoHTML-forAll ($node as node(), $model as map(*), $query as xs:string?){
    let $ref := xs:string(request:get-parameter("document", ""))
let $xml := doc(concat("/db/apps/BookOfOrders/data/edition/",$ref))
let $xsl := doc("/db/apps/BookOfOrders/resources/xslt/xmlToHtml.xsl")
let $params :=
<parameters>
   {for $p in request:get-parameter-names()
    let $val := request:get-parameter($p,())
    where  not($p = ("document","directory","stylesheet"))
    return
       <param name="{$p}"  value="{$val}"/>
   }
</parameters>

return
    transform:transform($xml, $xsl, $params)
};

В apps/BookofOrders/data/edition/ есть список файлов с именем FolioX. html, где x - номер страницы. (Я, вероятно, изменю имена на [FolioNumber]. xml, но это не проблема) Я пытаюсь создать текстовый слайдер (чтобы при открытии страницы отображалась страница, создавались дополнительные кнопки и Я могу скользить вправо и читать остальные страницы).

У меня есть таблица содержания, которая связана с преобразованными файлами:

declare function app:toc($node as node(), $model as map(*)) {
    for $doc in collection("/db/apps/BookOfOrders/data/edition")/tei:TEI
        return
        <li><a href="{concat('http://localhost:8080/exist/apps/BookOfOrders/pages/show.html?document=',functx:substring-after-last(document-uri(root($doc)), '/'))}">{document-uri(root($doc))}</a></li>   
};

Я думаю, мне интересно узнать, как изменить ссылку внутри, например, на Folio29 на Folio30. Могу ли я взять часть предоставленной ссылки и сделать назначение ссылки гибким, похожим, но не идентичным тому, что я делал в функции to c выше?

Я был бы очень рад, если бы кто-нибудь мог указать мне правильное направление.

1 Ответ

0 голосов
/ 19 января 2020

Учитывая выражение типа document-uri(root($doc)) (возможно, более просто util:document-name($doc), поскольку вы используете eXist), которое возвращает путь (или имя файла) к документу, оканчивающемуся на «FolioX», вам просто нужно изолировать X, затем приведите его к целому числу, чтобы вы могли выполнить сложение / вычитание значения:

document-uri(root($doc)) => substring-after("Folio") => xs:integer()

util:document-name($doc) => substring-after("Folio") => xs:integer()

Затем добавьте 1, и вы получите ваш следующий документ. Вычтите одно, и вы получите предыдущее значение

. Однако это может привести к неработающим ссылкам: Folio0 или Folio98 (при условии, что их всего 97). Чтобы избежать этого, вам может потребоваться восстановить полный список Fol ios, найти текущую позицию, а затем никогда не нажимать 0 или 98:

let $this-folio := $doc => util:document-name()
let $collection := $doc => util:collection-name()
let $all-folios := xmldb:get-child-resources($collection)
(: sort the filenames using UCA Numeric collation to ensure Folio2 < Folio10.
 : see https://www.w3.org/TR/xpath-functions-31/#uca-collations :)
let $sorted-folios := $all-folios => sort("?numeric=yes")
let $this-folio-n := index-of($all-folios, $this-folio)
let $prev-folio := if ($this-folio-n gt 1) then "Folio" || $this-folio-n - 1 else ()
let $next-folio := if ($this-folio-n lt count($all-folios)) then "Folio" || $this-folio-n + 1 else ()
return
    <nav>
         <prev>{$prev-folio}</prev>
         <this>{"Folio" || $this-folio-n}</this>
         <next>{$next-folio}</next>
    </nav>
...