1

我们正在使用 MarkLogic 9.0.5 和 DHF 3.0,并且我们正在尝试将多个源文档协调为非规范化的形式。但是,我们无法正确获取 xml 表单。

假设我们有一个家庭的源文件和一个家庭成员的源文件。现在,我们要生成一个协调的实体,如下所示:

<envelope>
<header></header>
<instance>
   <family>
     <name>Paulsen</name>
     <family-member>
         <name>John</name>
         <age>54</age>
     </family-member>
     <family-member>
         <name>Clarice</name>
         <age>38</age>
     </family-member>
   </family>
</instance>
</envelope>

但是,新的 DHF 结构迫使我们使用 json 对象映射来生成代码,但是我们将数据放入对象中的任何方式都不会像上面那样将其取出。例如:

declare function plugin:extract-instance-family
$source as node()?,
$options as map:map
) as map:map

let $name := get-family-name()
let $family-member := (<family-member>
                         <name>get-name()</name>
                         <age>get-age()</age>
                       </family-member>,
                       <family-member>
                         <name>get-name()</name>
                         <age>get-age()</age>
                       </family-member>)

let $model := 
  json:object()
    =>map:with('name', $name)
        =>map:with('family-member', '$family-member')

    return $model
};

导致一些 xml 像:

<envelope>
<header></header>
<instance>
   <family>
     <name>Paulsen</name>
     <family-member>
         <family-member>
             <name>John</name>
             <age>54</age>
         </family-member>
     </family-member>
     <family-member>
        <family-member>
           <name>Clarice</name>
           <age>38</age>
         </family-member>
     </family-member>
</instance>
</envelope>

这包含每个族节点两次。关于如何解决这个问题的任何建议?

PS我也尝试过将嵌套的json对象作为参数传递,但显然这会导致dhf流中的错误:

let $family-member := json-object()
                      => map:with('family-member', 'stuff')
4

1 回答 1

1

这种行为背后是有原因的。这遵循 MarkLogic 实体服务中使用的模式。您可以在此处阅读有关使用实体建模的好处的更多信息:http: //docs.marklogic.com/guide/entity-services/intro#id_23284

它可能有助于调整您的代码,使元素名称不会发生冲突,并清楚地表明第二层正在描述实体类型,这与第一层描述顶级实体的属性名称不同。

例如,

declare function plugin:extract-instance-family-type
  $source as node()?,
  $options as map:map
) as map:map

let $name := get-family-name()
let $family-member := (<family-member-type>
                         <name>get-name()</name>
                         <age>get-age()</age>
                       </family-member>,
                       <family-member>
                         <name>get-name()</name>
                         <age>get-age()</age>
                       </family-member-type>)

let $model := 
  json:object()
    =>map:with('name', $name)
        =>map:with('family-member', '$family-member')

    return $model
};

在这种情况下,您可以考虑将数据提取到 Java 程序的情况。顶级family-type实体将映射到Family Java类和该类的family-member元素familyMember字段,最后,family-member-type将映射到FamilyMember类及其相关字段。

此外,如果您打算将数据作为 JSON 来使用,我会更进一步,并推荐制作实体类型 TitleCase 和属性 camelCase 的约定。(家庭类型、家庭成员、家庭成员类型)。

于 2019-01-12T03:39:26.573 回答