如何替换MarkLogic中的节点?

时间:2015-03-31 12:03:47

标签: xml xquery marklogic

我需要使用XML表的MarkLogic替换现有节点的新名称。

我没有使用Query Console,我在.sjs文件中编写了所有代码。当我完成MarkLogic文档中给出的步骤时,它会抛出一些错误。

示例代码:

<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

我必须更改标签&#34;来自&#34;并将其替换为&#34; sender&#34;,即。预期产出:

<note>
  <to>Tove</to>
  <sender>Jani</sender>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

Java代码:

从java上传sjs转换

DatabaseClient client = DatabaseClientFactory.newClient(IP, 8000,
                           DATABASE_NAME, USERNAME, PWD, Authentication.DIGEST);

// get transform mgr
TransformExtensionsManager transMgr = client.newServerConfigManager()
    .newTransformExtensionsManager();
FileInputStream transStream = null;

try {
    transStream = new FileInputStream(path);
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
InputStreamHandle ipStreamHandle = new InputStreamHandle(transStream);
transMgr.writeJavascriptTransform(JS_TRANSFORM_NAME, ipStreamHandle);
client.release();

在从MarkLogic读取数据之前应用转换。数据库中的实际数据不会更新

ServerTransform transform = new ServerTransform(transformName);
DatabaseClient client = DatabaseClientFactory.newClient(IP, 8000,
    DATABASE_NAME, USERNAME, PWD, Authentication.DIGEST);
JSONDocumentManager docMgr = clientNew.newJSONDocumentManager();
InputStreamHandle handle = new InputStreamHandle();
docMgr.read("/" + uri + JSON_EXT, handle, transform);
String document = handle.toString();
clientNew.release();
return document;

.sjs代码:

declareUpdate();
var n = new NodeBuilder();
node = n.addElement("sender", "Jani").toNode();

xdmp.nodeReplace(
  cts.doc("/example.xml").xpath("/note/from"),
  node
);

错误:

Operation not allowed on the currently executing transaction with identifier declareUpdate

1 个答案:

答案 0 :(得分:4)

首先,请注意您可以在Query Console中使用JavaScript(只需更改查询类型)。我假设您需要将代码放入文件中,以便它成为应用程序的一部分,但在Query Console中运行是一个很好的方法来确定您需要的代码。

也就是说,您在评论中提供的代码是XQuery和JavaScript的混合。 xdmp:document-insert()是XQuery - 你可以看出,JavaScript并不支持带连字符的标识符。 xdmp:nodeReplace应该是xdmp:node-replace(XQuery)或xdmp.nodeReplace(JavaScript)。

您遇到的问题是XML不是JavaScript文件中的有效内容 - &lt;和&gt;符号被解释为小于和大于。您可以使用以下代码完成您尝试执行的操作:

declareUpdate();

var n = new NodeBuilder();
node = n.addElement("sender", "Jani").toNode();

xdmp.nodeReplace(
  cts.doc("/example.xml").xpath("/note/from"),
  node
);

在进一步发展之前,我认为你会从阅读Server-side JavaScript introduction中受益。这将为您提供更好的基础,帮助您实现目标。


编辑: 根据评论中的其他信息,解决方案是您正在使用的JavaScript代码旨在更新数据库,而您希望在内存中执行读取转换(Guidelines for Writing Transforms)。根据{{​​3}},您需要的是:

function fromToSender(context, params, content) 
{
  var doc = content.toObject();
  delete doc.note.from;
  doc.sender = 'Jani';
  return doc;
};

exports.transform = fromToSender;

请注意,这是一个库模块,其转换名为&#34; fromToSender&#34;。根据需要调整。