如何创建嵌套约束?

时间:2013-05-31 07:34:40

标签: xml xquery marklogic

考虑以下xml:

<Record>
   <Author>
      <FirstName>David</FirstName>
      <LastName>Raj</LastName>
   </Author>
   <Author>
      <FirstName>Sim</FirstName>
      <LastName>Son</LastName>
   </Author>
   <Editor>
      <FirstName>Sandy</FirstName>
      <LastName>John<LastName>
   </Editor>
</Record>

目前,我使用element-query来获取<Author>的值。

<constraint name="Author">
    <element-query ns="" name="Author" />
    {$OPTIONS}
</constraint>

我不想搜索或获取<LastName>元素的值,但仅需要Author元素的<FirstName>值。是否可以为此创建嵌套约束? 如果可能,任何人都可以详细说明吗?

感谢。

2 个答案:

答案 0 :(得分:3)

索菲:

您在查询中提供所包含元素的条件,而不是在约束中。

在这种情况下,您将创建两个约束:ContentOwnerType上的element-query约束和Description上的值约束。然后,在查询中,ContentOwnerType的element-constraint-query应包含描述中的value-constraint-query

以下是element-constraint-query的文档:

http://docs.marklogic.com/guide/search-dev/structured-query#id_64263

作为替代方案,您可以定义包含ContentOwnerType的字段并排除代码:

http://docs.marklogic.com/guide/admin/fields#id_78911

答案 1 :(得分:0)

如果我们只需要显示FirstName

我们可以创建约束作者参考

FirstName(为此我们需要在FirstName上创建索引)

<search:constraint name="Author">
  <search:range collation="http://marklogic.com/collation" type="xs:string" facet="true">
     <search:facet-option>ascending</search:facet-option>
     <search:element ns="" name="FirstName"/>
  </search:range>
</search:constraint>

或者

我们可以拥有Author / FirstName的路径索引,以确保FirstName仅在Author下。

<search:constraint name="Author">
   <search:range collation="http://marklogic.com/collation" type="xs:string" facet="true">
      <search:facet-option>ascending</search:facet-option>
       <search:path-index>*:Author/*:FirstName</search:path-index>
   </search:range>
</search:constraint>

希望这会有所帮助:)