xquery:如何以相同的方式转换多个文件,但对一个文件做一些特殊的事情
xquery: How to transform multiple files the same way but do sth special to one file
这是我将目录中的每个文件转换为轮播 (bootstrap) 的转换,但是,对于第一个文件 (Folio001.xml),我需要 class "active"要加到最后一行代码
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>
for $doc in collection("/db/apps/BookOfOrders/data/edition")/tei:TEI
return
<div class="carousel-item"> {transform:transform($doc, $xsl, $params)} </div>
};
有没有一种简单的方法可以在不更改大部分代码的情况下做到这一点?
我在想某事。像这样:
if(file-name="Folio001.xml")
return
<div class="carousel-item active"> {transform:transform($doc, $xsl, $params)} </div>
else
return
<div class="carousel-item"> {transform:transform($doc, $xsl, $params)} </div>
在此先致谢,
K
语法是例如
for $doc in collection(...)
return
if (document-uri($doc) = '...')
then
<div class="carousel-item active"> {transform:transform($doc, $xsl, $params)} </div>
else
<div class="carousel-item"> {transform:transform($doc, $xsl, $params)} </div>
我在字符串文字中省略了文件 name/URI 部分,因为我不确定数据库中文档的 eXist-db returns 到底是什么。
请注意还有一个 at
子句
for $doc at $pos in collection(...)
return
if ($pos = 1)
then
<div class="carousel-item active"> {transform:transform($doc, $xsl, $params)} </div>
else
<div class="carousel-item"> {transform:transform($doc, $xsl, $params)} </div>
因此,根据您对第一份文档的看法以及 eXist returns/orders 记录的方式,这也是一个选项。
无需重复所有 div
结构,只需将 "active" 值的条件移动到 @class
属性构造函数中:
<div> {
attribute {"class"} {"carousel-item", if (file-name="Folio001.xml") then "active" else () },
"transform:transform($doc, $xsl, $params)"
} </div>
这是我将目录中的每个文件转换为轮播 (bootstrap) 的转换,但是,对于第一个文件 (Folio001.xml),我需要 class "active"要加到最后一行代码
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>
for $doc in collection("/db/apps/BookOfOrders/data/edition")/tei:TEI
return
<div class="carousel-item"> {transform:transform($doc, $xsl, $params)} </div>
};
有没有一种简单的方法可以在不更改大部分代码的情况下做到这一点? 我在想某事。像这样:
if(file-name="Folio001.xml")
return
<div class="carousel-item active"> {transform:transform($doc, $xsl, $params)} </div>
else
return
<div class="carousel-item"> {transform:transform($doc, $xsl, $params)} </div>
在此先致谢, K
语法是例如
for $doc in collection(...)
return
if (document-uri($doc) = '...')
then
<div class="carousel-item active"> {transform:transform($doc, $xsl, $params)} </div>
else
<div class="carousel-item"> {transform:transform($doc, $xsl, $params)} </div>
我在字符串文字中省略了文件 name/URI 部分,因为我不确定数据库中文档的 eXist-db returns 到底是什么。
请注意还有一个 at
子句
for $doc at $pos in collection(...)
return
if ($pos = 1)
then
<div class="carousel-item active"> {transform:transform($doc, $xsl, $params)} </div>
else
<div class="carousel-item"> {transform:transform($doc, $xsl, $params)} </div>
因此,根据您对第一份文档的看法以及 eXist returns/orders 记录的方式,这也是一个选项。
无需重复所有 div
结构,只需将 "active" 值的条件移动到 @class
属性构造函数中:
<div> {
attribute {"class"} {"carousel-item", if (file-name="Folio001.xml") then "active" else () },
"transform:transform($doc, $xsl, $params)"
} </div>