Кодировать строку как html в eXist-db / XQuery

Я пытаюсь создать древовидное представление из коллекции (файловой системы). К сожалению, в некоторых файлах есть специальные символы, такие как ü ä и ö. И я бы хотел, чтобы они были закодированы в HTML как &­auml;

Когда я получаю их из переменной, они закодированы в URL. Сначала я декодирую их в UTF-8, а затем .... я не знаю, что делать дальше.

<li><a href="#">{util:unescape-uri($child, "UTF-8")}</a>

Функция util:parse делает прямо противоположное тому, что я хочу.

Вот рекурсивная функция:

xquery version "3.0";

declare namespace ls="ls";

declare option exist:serialize "method=html media-type=text/html omit-xml-declaration=yes indent=yes";

declare function ls:ls($collection as xs:string, $subPath as xs:string) as element()* {
  if (xmldb:collection-available($collection)) then
    (         
      for $child in xmldb:get-child-collections($collection)
      let $path := concat($collection, '/', $child) 
      let $sPath := concat($subPath, '/', $child)
      order by $child 
      return
        <li><a href="#">{util:unescape-uri($child, "UTF-8")}</a>
          <ul>
          {ls:ls($path,$sPath)}
          </ul>
        </li>,

        for $child in xmldb:get-child-resources($collection)
        let $sPath := concat($subPath, '/', $child)
        order by $child 
        return
            <li> <a href="javascript:loadPage('{$sPath}');">{util:unescape-uri($child, "UTF-8")}</a></li> 
    )
  else ()    
};  

let $collection := request:get-parameter('coll', '/db/apps/ebner-online/resources/xss/xml')
return
  <ul>{ls:ls($collection,"")}</ul> 

person romedius    schedule 31.07.2013    source источник


Ответы (1)


Вместо util:unescape-uri() я бы предложил использовать xmldb:encode-uri() и xmldb:decode-uri(). Используйте версию encode в названии коллекции или документа при ее создании / хранении. Используйте версию decode при отображении коллекции или названия документа. См. функцию документация по модулю xmldb.

Что касается принудительного использования &auml; вместо ü, это еще более сложная проблема сериализации. Оба, вместе с &#228;, являются эквивалентными представлениями одного и того же символа UTF-8. Почему бы просто не пропустить персонажа как ü?

person Joe Wicentowski    schedule 31.07.2013