xdmp: quote () - специальные строки символов <,> преобразуются в <и> в выходных данных - PullRequest
0 голосов
/ 19 октября 2018

У меня есть требование преобразовать XML-документ в файл тега InDesign.Теги Indesign не имеют конечных тегов.Поэтому я делаю рекурсивные замены существующих тегов элементов и некоторые преобразования в данных с приемлемыми в дизайне соглашениями по стилю.На последнем этапе я конвертирую документ в строку с помощью функции xdmp: quote ().Однако, поскольку теги Indesign объединяются в виде строк с данными, я получил следующий вывод.Позже я удалю элементы конечного тега и пространства имен, используя функцию замены

Примечание. Я преобразую в строку, поскольку мне нужно создать простой текстовый файл.Две вещи, которые мне не терпится узнать, почему xdmp: quote не рассматривает строку «как есть» и как мне решить это решение.Любые мысли или предложения будут действительно полезны.

Токовый выход

<CharStyle:Italic xmlns:CharStyle="http://www.Charstyle.indesign.com">
 funxtx com &lt;CharStyle:&gt;Jan 15 2010 </CharStyle:Italic>

Ожидаемый результат:

<CharStyle:Italic xmlns:CharStyle="http://www.Charstyle.indesign.com">
 funxtx com <CharStyle:>Jan 15 2010 </CharStyle:Italic>

Код:

declare namespace CharStyle = "http://www.Charstyle.indesign.com";
declare namespace cPosition = "http://www.cPosition.indesign.com";
let $book :=   <Book>
              <Author>Priscilla </Author>
              <Title>Xquery </Title>
              <Source>funxtx com Jan 15 2010</Source>
              <year>1990</year>
              <release-date>2018-01-01</release-date>
           </Book>
let $transformed-book := 
       cts:element-walk(
              $book,
              (xs:QName("Source"),xs:QName("Title"),    
               xs:QName("year"),xs:QName("release-date")
              ),
              (
             if(fn:local-name($cts:node) = "Source")then
               let $Source := xdmp:quote($cts:node/text())
               let $transformed-text:= 
                             if(fn:matches($Source,"(.*\s*?)(\w{3}\s*\d{2}\s*\d{4})"))then
                               let $date-transform:=  fn:replace($Source,"(.*\s*?)(\w{3}\s*\d{2}\s*\d{4})","$1<CharStyle:>$2")
                                return $date-transform
                             else $cts:node/text()
               return element{xs:QName("CharStyle:Italic")}{$transformed-text}
             else if(fn:local-name($cts:node) = "year")then element{xs:QName("CharStyle:Italic")}{$cts:node/text()}
             else if(fn:local-name($cts:node) = "release-date")then element{xs:QName("cPosition:Superscript")}{fn:concat($cts:node/text(),"<cPosition:>")}
             else if (fn:local-name($cts:node) = "Title")then element{xs:QName("cPosition:Subscript")}{fn:concat($cts:node/text(),"<cPosition:>")}
             else() 
           )
    )
let $string-doc := xdmp:quote($transformed-book)
return $string-doc                       

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Думайте об этом так: ваш ожидаемый вывод не является допустимым XML, поэтому он не может быть xdmp:unquote d.Это подразумевает (хотя я не уверен, насколько строго), что нет никакой комбинации XML и текста, которая могла бы быть xdmp:quote d для достижения желаемого результата.

Одним из вариантов будет создание некоторого XML, которыйможет быть указан для достижения почти желаемого результата.например, сборка $transformed-text с использованием допустимых заполнителей XML вместо реальных тегов InDesign, например <CharStyle:REPLACEME/>.Затем после вызова xdmp:quote() выполните замену строки для каждого типа заполнителя, который вы использовали, например, чтобы заменить все экземпляры "<CharStyle:REPLACEME/>" на "<CharStyle:>".

0 голосов
/ 24 октября 2018

вариант ответа bens похож на xhtml.создать закрывающие теги как самозакрывающуюся цитату

 <Tag/> 

.затем строка заменяет, обратите внимание, что ваш пример тегов не является допустимым xml, так как формат разбирается как qname с пустым локальным именем.Вы можете злоупотребить этим, используя заполнитель, аналогичный предложению bens

 <Special:REPLACEME/>

, а затем заменить ": REPLACEME /" -> ":", чтобы избежать необходимости индивидуальной замены всех возможных тегов

альтернатива - используйте xml комментарии

<!--<Special:>-->

цитата, затем удалите все "".

0 голосов
/ 20 октября 2018

Укажите параметр вывода method, чтобы при вызове xdmp:quote иметь значение text.

Скобки экранируются, потому что это правила для вывода XML: он не будет действительнымXML иначе.

...