【问题标题】:how to get document that contain more than collection in xslt?如何在 xslt 中获取包含多个集合的文档?
【发布时间】:2021-04-09 09:08:27
【问题描述】:
let $stylesheet := "abc.xsl"
let $params := map:map()
let $_ := map:put ($params,"col1","abc")
return
xdmp:xslt-invoke(
            $stylesheet, (), $params,
            <options xmlns="xdmp:eval">
                 <template>a:schema</template>
           
            </options>)

abc.xsl

<xsl:template name="a:schema">
          <xsl:param name="collection-uri" as="xs:string" select="$col1"/>
          <xsl:apply-templates select="collection($collection-uri)"/>
       </xsl:template>

目前,我们正在收集“abc”集合中的所有文档。 但是我想在 $param 映射中添加多个集合,这样包含集合“abc”和“def”的文档就会出现 例如:

 | Document| collection
|:---------|:----------:|
| Doc1     | abc, def   |
| Doc2     | abc        |
| Doc3     | abc, def   |

它将选择 Doc1 和 Doc3

【问题讨论】:

标签: xslt schema xquery marklogic


【解决方案1】:

collection() 接受xs:string 的序列,但会返回指定集合中的任何文档。

如果您只想要所有指定集合中的文档,您可以在cts:and-query() 中使用cts:search()cts:collection-query() 序列。

<xsl:template match="/">
  <xsl:param name="collection-uri" as="xs:string*" select="$col1"/>
  <xsl:apply-templates select="cts:search(doc(), cts:and-query(( $collection-uri ! cts:collection-query(.) )))"/>
</xsl:template>

启用1.0-ml 方言,以便您可以通过将以下属性添加到xsl:stylesheet 元素来使用cts 内置功能:

xdmp:dialect="1.0-ml"

$collection-uri 参数声明为xs:string,因此它只有一个字符串值。您可以将其更改为带有*+ 量词的字符串序列:

<xsl:param name="collection-uri" as="xs:string*" select="$col1"/> 

然后在$col1参数上设置集合:

let $_ := map:put ($params,"col1", ('abc', 'def'))

【讨论】:

  • 嗨,请检查更新后的问题,我希望那些包含集合(abc 和 def)的文档使用 fn:collection(("abc","def")) ,这些文档也将come 包含 abc 或 def 集合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2017-04-02
  • 2023-04-03
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
相关资源
最近更新 更多