transform-to-json - 自定义配置丢弃元素?没有阵列?

时间:2013-04-21 05:34:56

标签: marklogic

我有以下xml

<foods
  xmlns="http://example.com/agt"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
  <food id="1" name="celery">
    <price>50.2</price>
  </food>
  <food id="2" name="beets">
    <price>23.3</price>
  </food>
  <food id="3" name="goat cheese">
    <price>0.5</price>
  </food>
</foods>

使用以下xsd:

<xs:schema
  targetNamespace="http://example.com/agt"
  attributeFormDefault="unqualified"
  elementFormDefault="unqualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="price" type="xs:decimal"/>
  <xs:element name="food">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="price"/>
      </xs:sequence>
      <xs:attribute name="id" type="xs:integer"/>
      <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="foods">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="food" maxOccurs="unbounded" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

当我在控制台中执行以下查询时:

xquery version "1.0-ml";
import module namespace json = "http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";
declare namespace agt = "http://example.com/agt";
let   $c := json:config("custom")
      , $_ := map:put($c,"array-element-names", "food")
return
  json:transform-to-json( doc("foods.xml") , $c )

......我明白了:

{"foods":{"food":{"id":3, "name":"goat cheese", "price":0.5}}}

有些东西没有点击给我。食物元素怎么了?没有数组,只有最后一个数组进入输出。请注意,取出array-element-names会使解决缺少的食物元素。

这是一个错误还是我做错了?我刚开始使用MarkLogic Server,所以我很可能做错了。任何建议表示赞赏。

1 个答案:

答案 0 :(得分:3)

您需要指明食物是一个数组元素。 由于您现在已将食物放入命名空间,因此您的数组元素名称无法找到它。 您需要使用xs:QName()来提供“food”的全名或使用

声明配置的默认命名空间

e.g。这应该工作

  , $_ := map:put($c,"array-element-names", xs:QName("agt:food") )

替代地

   , $_ := map:put($c,"element-namespace","http://example.com/agt")

具有使转换可逆的良好副作用。