我需要将xml文档转换为InDesign标记文件。 Indesign标签没有结束标签。因此,我正在对现有元素标签进行递归替换,并使用设计可接受的样式约定对数据进行一些转换。最后一步,我将使用xdmp:quote()函数将文档转换为字符串。但是,由于Indesign标记是与数据串联在一起的字符串,因此得到以下输出。稍后,我将使用替换功能删除结束标记元素和名称空间
注意:由于我需要生成纯文本文件,因此我正在转换为字符串。我很想知道两件事,为什么xdmp:quote不能按原样对待字符串,以及我将如何解决该解决方案。任何想法或建议都会很有帮助。
电流输出
<CharStyle:Italic xmlns:CharStyle="http://www.Charstyle.indesign.com">
funxtx com <CharStyle:>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
答案 0 :(得分:2)
这样想:您的预期输出不是有效的XML,因此无法xdmp:unquote
d。这意味着(尽管我不确定是否如此严格),没有XML和文本的组合可以xdmp:quote
d来实现所需的输出。
一种选择是构建一些XML,这些XML可以引用以实现几乎所需的输出。例如使用有效的XML占位符而非实际的InDesign标签构建$transformed-text
,例如<CharStyle:REPLACEME/>
。然后,在调用xdmp:quote()
之后,对您使用的每种占位符进行字符串替换,例如将"<CharStyle:REPLACEME/>"
的所有实例替换为"<CharStyle:>"
。
答案 1 :(得分:1)
指定输出选项method
在text
调用中具有值xdmp:quote
。
括号已被删除,因为这是XML输出的规则:否则它将不是有效的XML。
答案 2 :(得分:0)
变量的答案类似于xhtml。将非关闭标签创建为自关闭
import sys
print sys.path
报价。然后字符串替换 请注意,您的示例标记不是有效的xml,因为格式解析为qname且具有空的本地名称。您可以使用类似于ben建议的占位符来滥用它
<Tag/>
然后替换为“:REPLACEME /”->“:”,以避免必须分别替换所有可能的标签
替代方法-使用xml注释
<Special:REPLACEME/>
引用,然后删除所有“”。