1

我需要将 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                       
4

3 回答 3

2

可以这样想:您的预期输出不是有效的 XML,所以它不能是xdmp:unquoted。这意味着(尽管我不确定有多严格)没有 XML 和文本的组合可以xdmp:quote实现您想要的输出。

一种选择是构建一些可以引用的 XML 以实现几乎所需的输出。$transformed-text例如,使用有效的 XML 占位符而不是真正的 InDesign 标签构建,例如<CharStyle:REPLACEME/>. 然后在调用 之后xdmp:quote(),对您使用的每种占位符进行字符串替换,例如替换"<CharStyle:REPLACEME/>"with的所有实例"<CharStyle:>"

于 2018-10-20T02:56:28.187 回答
1

指定输出选项以在调用method中具有值。textxdmp:quote

括号被转义,因为这是 XML 输出的规则:否则它将不是有效的 XML。

于 2018-10-19T21:25:09.047 回答
0

bens 上的变体答案类似于 xhtml。将非关闭标签创建为自关闭

 <Tag/> 

引用。然后字符串替换注意您的示例标签不是有效的 xml,因为格式解析为带有空本地名称的 qname。您可以通过使用类似于 bens 建议的占位符来滥用它

 <Special:REPLACEME/>

然后替换 ":REPLACEME/" -> ":" 以避免必须单独替换所有可能的标签

替代方案——使用 xml 注释

<!--<Special:>-->

引用然后删除所有“”。

于 2018-10-24T05:24:15.413 回答