其余扩展不会转换 json

rest extension will not transform json

我有一个 MarkLogic Rest 扩展,需要将 JSON 转换为 OBI 对象。对于初学者,我创建了一个 XML 输入并为其创建了转换,这些工作。

现在真实数据和JSON略有不同,所以我需要将JSON转换为XML。我有一个 xsl 转换示例,我似乎无法开始工作...

我想通过其余扩展加载的 JSON 文档:

{
    "wifi_raw": [
        {
            "id": "4354279",
            "hostname": "rb-0046",
            "mac": "00:0C:43:00:08:F4",
            "firstseen": "2015-08-12 13:54:50",
            "lastseen": "2015-08-12 13:54:50",
            "rssi": "-1",
            "packets": "1",
            "bssid": "24:A4:3C:53:19:62",
            "probes": "",
            "processed": "0"
        },
        {
            "id": "4354257",
            "hostname": "rb-0046",
            "mac": "00:0E:58:BC:E9:03",
            "firstseen": "2015-08-12 13:48:45",
            "lastseen": "2015-08-12 13:52:10",
            "rssi": "-58",
            "packets": "3",
            "bssid": "B8:E9:37:17:DA:EF",
            "probes": "sonos_hbbzdjrspta2htbcqeb0gcjouc",
            "processed": "0"
        },
        {
            "id": "4354273",
            "hostname": "rb-0046",
            "mac": "00:0E:58:BC:E9:03",
            "firstseen": "2015-08-12 13:48:45",
            "lastseen": "2015-08-12 13:54:32",
            "rssi": "-61",
            "packets": "4",
            "bssid": "B8:E9:37:17:DA:EF",
            "probes": "sonos_hbbzdjrspta2htbcqeb0gcjouc",
            "processed": "0"
        }
    ]
}

在摄取时,我想将其转换为 OBI 对象,这些对象都已定义并适用于等效的 XML 输入文档...

如果我这样做

json:transform-from-json($source)

在摄取扩展中,JSON 转换为 XML:

<?xml version="1.0"?>
<json xmlns="http://marklogic.com/xdmp/json/basic" type="object">
  <wifi__raw type="array">
    <json type="object">
      <id type="string">4354279</id>
      <hostname type="string">rb-0046</hostname>
      <mac type="string">00:0C:43:00:08:F4</mac>
      <firstseen type="string">2015-08-12 13:54:50</firstseen>
      <lastseen type="string">2015-08-12 13:54:50</lastseen>
      <rssi type="string">-1</rssi>
      <packets type="string">1</packets>
      <bssid type="string">24:A4:3C:53:19:62</bssid>
      <probes type="string"/>
      <processed type="string">0</processed>
    </json>
    <json type="object">
      <id type="string">4354257</id>
      <hostname type="string">rb-0046</hostname>
      <mac type="string">00:0E:58:BC:E9:03</mac>
      <firstseen type="string">2015-08-12 13:48:45</firstseen>
      <lastseen type="string">2015-08-12 13:52:10</lastseen>
      <rssi type="string">-58</rssi>
      <packets type="string">3</packets>
      <bssid type="string">B8:E9:37:17:DA:EF</bssid>
      <probes type="string">sonos_hbbzdjrspta2htbcqeb0gcjouc</probes>
      <processed type="string">0</processed>
    </json>
    <json type="object">
      <id type="string">4354273</id>
      <hostname type="string">rb-0046</hostname>
      <mac type="string">00:0E:58:BC:E9:03</mac>
      <firstseen type="string">2015-08-12 13:48:45</firstseen>
      <lastseen type="string">2015-08-12 13:54:32</lastseen>
      <rssi type="string">-61</rssi>
      <packets type="string">4</packets>
      <bssid type="string">B8:E9:37:17:DA:EF</bssid>
      <probes type="string">sonos_hbbzdjrspta2htbcqeb0gcjouc</probes>
      <processed type="string">0</processed>
    </json>
  </wifi__raw>
</json> 

我现在的最小 xsl 转换是这样的

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

  xmlns:xdmp="http://marklogic.com/xdmp"
  xmlns:json="http://marklogic.com/xdmp/json"
  xmlns:basic="http://marklogic.com/xdmp/json/basic"
  xmlns:map="http://marklogic.com/xdmp/map"

  xmlns:obj="http://marklogic.com/solutions/obi/object"

  extension-element-prefixes="xdmp">

  <xdmp:import-module namespace="http://marklogic.com/xdmp/json" href="/MarkLogic/json/json.xqy"/>

  <xsl:param name="params" as="map:map"/>
  <xsl:variable name="ingest-time" select="(map:get($params, 'ingest-time'), 'false')[1] = 'true'"/>

  <xsl:template match="/text()[empty(../*)]">
    <xsl:apply-templates select="json:transform-from-json(.)"/>
  </xsl:template>

  <xsl:template match="basic:json">
    <results>
      <objects>
        <!-- test -->
        <xsl:text>example</xsl:text>
      </objects>

      <links>
        <!-- links go here-->
        <xsl:text>example</xsl:text>
      </links>
    </results>
  </xsl:template>
</xsl:stylesheet>

我没有从

返回任何结果
let $result := eput:apply-document-transform(fn:concat($dataset, '-transform'), $params, $context, $source)/element()

在摄取扩展中。

据我了解,匹配 "match="/text()[empty(../*)]">" 对于 JSON 文档节点是正确的,因此相同的转换- from-json 将生成原始 JSON 文档的 XML 版本,该文档也在上面发布,因此我至少可以使用 "match="basic:[=61= 找到根节点]""

我在这里错过了什么?

编辑工作解决方案

这基本上是有效的。首先,我们确保匹配新的 JSON object-node(),然后您必须非常小心匹配的 XSL 模板。我有两个模板匹配 "basic:json" 结果只有最后一个被执行...

现在根匹配

<xsl:template match="/basic:json">

并且数组中的那个与 wifi__raw 的任何子项匹配,例如

<xsl:template match="basic:wifi__raw/*">

完整的 XSL 现在看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

  xmlns:xdmp="http://marklogic.com/xdmp"
  xmlns:json="http://marklogic.com/xdmp/json"
  xmlns:basic="http://marklogic.com/xdmp/json/basic"
  xmlns:map="http://marklogic.com/xdmp/map"

  xmlns:obj="http://marklogic.com/solutions/obi/object"

  extension-element-prefixes="xdmp">

  <xdmp:import-module namespace="http://marklogic.com/xdmp/json" href="/MarkLogic/json/json.xqy"/>

  <xsl:param name="params" as="map:map"/>
  <xsl:variable name="ingest-time" select="(map:get($params, 'ingest-time'), 'false')[1] = 'true'"/>

  <!-- voor MarkLogic 7 -->
  <xsl:template match="/text()[empty(../*)]">
    <xsl:apply-templates select="json:transform-from-json(.)"/>
  </xsl:template>

  <!-- voor MarkLogic 8 -->
  <xsl:template match="/node()[not(self::*)]">
    <xsl:apply-templates select="json:transform-from-json(.)"/>
  </xsl:template>

  <xsl:template match="/basic:json">
    <xsl:apply-templates select="basic:wifi__raw"/>
  </xsl:template>

  <xsl:template match="basic:wifi__raw">
    <xsl:variable name="objects" as="element()*">
      <xsl:apply-templates select="*" />
    </xsl:variable>

    <results>
      <objects>
        <xsl:sequence select="$objects" />
      </objects>

    </results>
  </xsl:template>

  <xsl:template match="basic:wifi__raw/*">
    <foundId>
      <xsl:value-of select="basic:id" />
    </foundId>
  </xsl:template>

</xsl:stylesheet>

这是由于 MarkLogic 8 处理 JSON 数据类型的方式不同于 MarkLogic 7 及之前的版本。在 MarkLogic 8 中,JSON 数据被处理成 object-node() 数据,而不是 text()。不幸的是,您不能在 XSLT 中显式测试 object-node(),但是有几种方法可以解决这个问题。像这样更改 text() 的匹配项:

<xsl:template match="/node()[not(self::*)]">
  <xsl:apply-templates select="json:transform-from-json(.)"/>
</xsl:template>

这应该适用于 MarkLogic 7 和 8。

HTH!