cts:包含文档和属性片段内元素的value-tuples不起作用

时间:2015-08-17 11:56:35

标签: marklogic

我有这样的文件:

<?xml version="1.0" encoding="UTF-8"?>
   <a>2015-08-12T09:51:16-05:00</a>

在同一个URI中我有这样的属性:

<?xml version="1.0" encoding="UTF-8"?>
    <prop:properties xmlns:prop="http://marklogic.com/xdmp/property">
    <prop:b>2015-08-12T09:51:16-05:00</prop:b>
    </prop:properties>

我在元素dateTimea上有prop:b类型的范围索引。如果我在aprop:b上运行cts:values,我会从词典中获取相应的值,但是当我运行以下内容时,我得到一个空序列:

cts:value-tuples((cts:element-reference(xs:QName("prop:b")),
   cts:element-reference(xs:QName("a"))),("any"))

请帮我弄清楚我错过了什么。

版本:7.0.5

1 个答案:

答案 0 :(得分:1)

any选项表示:

  

应包括来自任何片段的共现。

其中任何片段包含documentpropertieslock片段。

但问题是,每个共现仍然需要在 中发生一个相同的片段,无论哪个片段。因此,文档片段中的a和属性片段中的prop:b永远不会作为共现返回。实现此功能的唯一方法是将aprop:b放在同一个片段中。

一种推荐的方法是将文档包装在额外的根元素中以允许兄弟元素。这是MarkLogic中一种非常常见的模式,称为信封模式。额外的空间通常用于诸如出处,附加元数据,嵌入式三元组,标准化值等等。在您的情况下,它可能看起来很简单:

<envelope>
  <header>
    <prop:b>2015-08-12T09:51:16-05:00</prop:b>
  </header>
  <content>
    <a>2015-08-12T09:51:16-05:00</a>
  </content>
</envelope>

包装元素的名称并不重要,但envelopeheadercontent等元素名称相当常见。将这些包装器元素放在一个单独的命名空间中会很有用,这样可以更容易区分它们。

HTH!