Marklogic初识
1.概述
- Marklogic是一家美国软件公司,开发和提供企业级的NoSQL数据库。其产品是一个集存储、管理、搜索JSON和XML文档和图形数据的multi-model NoSWL数据库。可以将海量数据通过灵活的组织结构去构建庞大的web应用。
- Marklogic在国外拥有广泛的市场,包括BBC、播音公司、道琼斯、NBC等。公司成立于2001年,总部位于美国硅谷。从2014年的收益看,Marklogic已经成为了NoSQL数据库的leader.
在windows上安装Marklogic Server
摘要:要想学习Marklogic,首先需要有相应的环境,本文介绍了如何在windows平台上安装Marklogic.实际生产中,一般会将其安装在linux平台上。
- 准备
类似于oracle,Marklogic在非商用的情况下,对开发者来说是免费下载和使用的。
首先,需要在Marklogic开发者网站上注册,成为注册用户后才可以下载Marklogic.
接下来可以在产品中心,找到对应平台的下载链接。我下载的是win版的MarkLogic-8.0-4-amd64.msi。只有160M左右,比起当初下载的oracle可是小巧不少啊。 - 配置
整个安装过程非常简单,和普通的win软件一样,一键安装默认会安装在c盘,我选择自定义安装,将其安装在D:/Marklogic目录下。
开始菜单启动Admin marklogic server,和普通的win软件没什么异同。弹出的启动窗口启动完成后,自动关闭,说明安装已经完毕了。
在浏览器中输入localhost:8001,回车,就到了初始化配置界面。
- join a Cluster
由于学习阶段我们还不会用到集群,配置cluster,可以直接忽略,点击skip。
- Security Setup
接下来,配置server的用户名和密码。之后,在每次登陆server的时候,网页都将提示我们输入次用户名和密码,请牢记
- Admin page
这个就是marklogic的后台管理页面了,之后会经常和它打招呼
- Query Console
在浏览器输入http://localhost:8000/qconsole/,键入之前设置的用户名和密码,就来到了console界面。之后我们需要测试代码,写demo,就可以在这里完成
- join a Cluster
- 激活
细心的你有没有发现,在Admin page 页面上,上图中浅绿色部分,有一行标示No license key has been entered.说明我们当前用的server,还是没有license的,我们需要去申请一个license.
在申请许可证书页面,点击Get Deverloper License, 输入些许个人信息,同意Marklogic条约,即可免费申请到一个license key,当然它只能要求你在本机上使用,而且不能做商用。
到这里,已经成功申请到了许可。点击ok,server会自动重启。刷新Admin Page页面,发现未许可的提示已经没有了。现在你应该可以尽情地享用Marklogic了,当然按照官网的介绍,这个license只有6个月时间,之后需要再次申请。
Marklogic预备知识——XML、XPath、XQuery
前言: Marklogic在设计之初就注重于XML文档标准,并将XQuery作为其查询语言。因此在学习marklogic之前,有必要对XML相关知识做下了解。
XML
定义
XML(Extensible Markup Language)可扩展标记语言,设计之初就是为了存储和传输数据,标签本身没有被预定义,符合w3c标准。
同时为了让XML便于解析,XML语法有如下规定:
1. 任何起始标签都应有结束标签。<div>Marklogic</div>
2. 可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。<div/>
3. 标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签。<div><p></p></div>
4. 所有的属性都必须有值。<input name="text">
5. 所有的属性都必须在值的周围加上双引号。
文档声明
XML文档声明向我们声明了这是个XML文件,最简单的声明:<?xml version="1.0" ?>
,目前只有1.0版本,还可以规定文档编码<?xml version="1.0" encoding="utf-8" ?>
.值得注意的是文档声明不符合XML语法,不属于XML内容,位置始终处于文件第一行。
注释
- 注释语法
<!--这里写注释-->
- 声明之前不能有注释
- 注释不能嵌套
举例
<code class="language-xml hljs has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="utf-8" ?></span> <span class="hljs-tag"><<span class="hljs-title">books</span> <span class="hljs-attribute">xmlns</span>=<span class="hljs-value">'http://www.csdn.net/example/book'</span>></span> <span class="hljs-comment"><!--这是一本书的信息--></span> <span class="hljs-tag"><<span class="hljs-title">book</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"1010596200"</span> <span class="hljs-attribute">category</span>=<span class="hljs-value">"编程"</span>></span> <span class="hljs-tag"><<span class="hljs-title">title</span>></span>Java编程思想<span class="hljs-tag"></<span class="hljs-title">title</span>></span> <span class="hljs-tag"><<span class="hljs-title">author</span>></span>埃克尔<span class="hljs-tag"></<span class="hljs-title">author</span>></span> <span class="hljs-tag"><<span class="hljs-title">pubDate</span>></span>2007-6-1<span class="hljs-tag"></<span class="hljs-title">pubDate</span>></span> <span class="hljs-tag"><<span class="hljs-title">pages</span>></span>880<span class="hljs-tag"></<span class="hljs-title">pages</span>></span> <span class="hljs-tag"><<span class="hljs-title">price</span>></span>30.0<span class="hljs-tag"></<span class="hljs-title">price</span>></span> <span class="hljs-tag"></<span class="hljs-title">book</span>></span> <span class="hljs-comment"><!--这是另一本书的信息--></span> <span class="hljs-tag"><<span class="hljs-title">book</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"1010696100"</span> <span class="hljs-attribute">category</span>=<span class="hljs-value">"文学"</span>></span> <span class="hljs-tag"><<span class="hljs-title">title</span>></span>红楼梦<span class="hljs-tag"></<span class="hljs-title">title</span>></span> <span class="hljs-tag"><<span class="hljs-title">author</span>></span> <span class="hljs-tag"><<span class="hljs-title">firstAuthor</span>></span>曹雪芹<span class="hljs-tag"></<span class="hljs-title">firstAuthor</span>></span> <span class="hljs-tag"><<span class="hljs-title">secondAuthor</span>></span>高鹗<span class="hljs-tag"></<span class="hljs-title">secondAuthor</span>></span> <span class="hljs-tag"></<span class="hljs-title">author</span>></span> <span class="hljs-tag"><<span class="hljs-title">pubDate</span>></span>2012-9-1<span class="hljs-tag"></<span class="hljs-title">pubDate</span>></span> <span class="hljs-tag"><<span class="hljs-title">pages</span>></span>1606<span class="hljs-tag"></<span class="hljs-title">pages</span>></span> <span class="hljs-tag"><<span class="hljs-title">price</span>></span>41.5<span class="hljs-tag"></<span class="hljs-title">price</span>></span> <span class="hljs-tag"></<span class="hljs-title">book</span>></span> <span class="hljs-tag"></<span class="hljs-title">books</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li></ul>
XPath
XPath即XML路径语言,可在 XML 文档中对元素和属性进行遍历。它包含一个标准的函数库,符合w3c标准。
节点
在XPath 中,有如下七种类型的节点:
元素element : <title>
属性attribute : id='1010596200'
文本text : 红楼梦
命名空间namespace : xmlns='http://www.csdn.net/example/book'
处理指令processing instruction:强大的函数库
注释comment : <!--这是另一本书的信息-->
文档节点root : 即根节点 <books>
语法
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
举例
表达式 | 描述 |
---|---|
books | 选取 books 元素的所有子节点。 |
/books | 选取根元素 bookstore。 |
books//title | 选取属于 books 的子元素的所有 title 元素。 |
//price | 选取所有 price 元素。 |
books/book[1] | 选取属于 books 子元素的第一个 book 元素。 |
/bookstore/book[price>35.0] | 选取所有单价大于35的 book 元素。 |
//@category | 选取所有名为 category 的属性。 |
//* | 选取文档中的所有元素。 |
/books/book/title/text() | 选取文档所有 title 值。 |
fn:count(/books/book) | 计算书的数量,为2本。 |
XQuery
XQuery = XML Query,是W3C所制定的一套标准,用来从XML文档中提取信息。XQuery 相对于 XML,等同于 SQL 相对于数据库。
基础语法
- XQuery 对大小写敏感
- XQuery 的元素、属性以及变量必须是合法的 XML 名称。
- XQuery 字符串值可使用单引号或双引号。
- XQuery 变量由
“$”
并跟随一个名称来进行定义,如,$str - XQuery 注释被 (: 和 :) 分割,例如,(: 这是XQuery 注释 :)
FLWOR 表达式
这里的FLWOR是由XQuery的五个常用关键词for、let、where、order by、return首字母合并而来,音同单词‘flower’(鲜花),但是写法不同。且FLWOR字母顺序由XQuery语法而定,不可变更。
- for : 将某一节点的下所有元素依次赋值到一变量中。
- let : 语句定义变量。
- where : 语句给出了选取条件。
- order by : 语句定义了排序次序。
- return : 语句规定返回什么内容。
首先,我们需要准备一个“book.xml”文件,数据就是第一节的例子内容。基于第二节的内容,我们已经可以看懂/books/book[price>30]/title
就是选取书的单价高于30元的书名,现在你需要知道doc("books.xml")/books/book[price>30]/title
表达的是同样的意思。
接下来,我们看一段代码
<code class="language-xquery hljs bash has-numbering"><span class="hljs-keyword">for</span> <span class="hljs-variable">$x</span> <span class="hljs-keyword">in</span> doc(<span class="hljs-string">"books.xml"</span>)/books/book where <span class="hljs-variable">$x</span>/price><span class="hljs-number">30</span> <span class="hljs-keyword">return</span> <span class="hljs-variable">$x</span>/title</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
第一行是在做遍历,把 books 元素下的所有 book 元素提取到名为 $x 的变量中;第二行给出判断条件,需要book元素下的price值大于30;第三行返回数据,满足判断条件的title元素。此 FLWOR 表达式所选取的数据和上面的路径表达式是相同的。得到的数据为<title>红楼梦</title>
.
条件表达
“if-then-else” 在 XQuery 中做条件选择使用。
请看下面的例子:
<code class="language-xquery hljs bash has-numbering"> <span class="hljs-keyword">for</span> <span class="hljs-variable">$x</span> <span class="hljs-keyword">in</span> doc(<span class="hljs-string">"books.xml"</span>)/books/book <span class="hljs-keyword">return</span> <span class="hljs-keyword">if</span> (<span class="hljs-variable">$x</span>/@category=<span class="hljs-string">"文学"</span>) <span class="hljs-keyword">then</span> <Literature>{data(<span class="hljs-variable">$x</span>/title)}</Literature> <span class="hljs-keyword">else</span> <Programming>{data(<span class="hljs-variable">$x</span>/title)}</Programming></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>
结果为
<code class="language-xml hljs has-numbering"><span class="hljs-tag"><<span class="hljs-title">Literature</span>></span>红楼梦<span class="hljs-tag"></<span class="hljs-title">Literature</span>></span> <span class="hljs-tag"><<span class="hljs-title">Programming</span>></span>Java编程思想<span class="hljs-tag"></<span class="hljs-title">Programming</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li></ul>
请注意 “if-then-else” 的语法:if 表达式后的圆括号是必需的,else 也是必需的,如果else没有语句,仅仅写 “else ()” 也是可以的。
比较
在 XQuery 中,有两种方法来比较值。
通用比较:=, !=, <, <=, >, >=
值的比较:eq、ne、lt、le、gt、ge
这两种比较方法的差异如下:
请看下面的 XQuery 表达式:
books//book/price > 10
如果 price 的值大于 10,上面的表达式的返回值为 true。
books//book/price gt 10
如果仅返回一个price ,且它的值大于 10,那么表达式返回 true。如果不止一个 price 被返回,则会发生错误。
当然这一差异属于XQuery语法,在Marklogic下,没有这一约束。
自定义函数
<code class="language-xquery hljs r has-numbering">declare <span class="hljs-keyword">function</span> 前缀:函数名($参数 AS 数据类型) AS 返回的数据类型 { (: <span class="hljs-keyword">...</span>函数代码<span class="hljs-keyword">...</span> :) };</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>
应注意:
- 请使用 declare function 关键词
- 函数名须使用前缀
- 参数的数据类型通常与在 XML Schema 中定义的数据类型一致
- 函数主体须被花括号包围
举个例子:
<code class="language-xquery hljs php has-numbering"><span class="hljs-keyword">declare</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">local</span>:<span class="hljs-title">TotalPrice</span><span class="hljs-params">( <span class="hljs-variable">$price</span> as xs:decimal?, <span class="hljs-variable">$count</span> as xs:int?)</span> <span class="hljs-title">as</span> <span class="hljs-title">xs</span>:<span class="hljs-title">decimal</span>? {</span> let <span class="hljs-variable">$tp</span> := <span class="hljs-variable">$price</span> * <span class="hljs-variable">$count</span> <span class="hljs-keyword">return</span> <span class="hljs-variable">$tp</span> };</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>
上例中,调用函数时,传入书的单价和要购买的本数,即可得出总价。
local:TotalPrice(/books/book[price>30]/price, 2)
返回83.
另:(常见的 XML Schema 数据类型)
Simple Type | Comments |
---|---|
string | 字符串 |
int | 整数 |
decimal | -1.23, 0, 123.4, 1000.00 |
boolean | true/false |
dateTime | 2015-12-07T23:20:00.000 |
QName | 带命名空间的XML签名 |
Marklogic qconsole简介
前言: query console是Marklogic为了便于开发者快速测试代码,调试问题,资料查询,运行XQuery脚本而设计的查询控制台。本节主要介绍它的基本结构和使用要点。
qConsole启动
在win7上,直接在浏览器输入http://localhost:8000/qconsole/。输入用户名好密码,可以看到下图展示界面
如果Marklogic安装在其他服务器上,访问方式应为
http://host_name:8000/qconsole
如果没有看到上面界面,可能是权限不够,要想使用qConsole,还必须成为qconsole-user成员,admin用户可以管理成员。
有时你的权限可能是只读,你可以正常打开上述页面,并执行相关的查询操作,但当你运行诸如文档插入或删除命令时,会被Marklogic拒绝。
对于某一特定用户,Marklogic只会保持一个session在server端。如果某一用户同时开启多个qConsole, 它们的状态会不一致,因此最好不要多个浏览器或标签页下使用同一用户名登陆。
在windows下,如果Marklogic是以默认方式安装的,会开机自启动,可能会拖慢开机速度。以下方式可以将其变为手动启动:
计算机 –> (右键) –> 管理 –> 服务和应用程序 –> 服务 – > MarkLogic
常规 –> 启动类型 –> 手动 –>确定
下次开机后,就不能直接在浏览器中输入qConsole地址打开,而是需要先手动启动服务
qConsole组件
query 可以执行的XQuery, SQL, SPARQL,JavaScript脚本。当你在Query Console中运行语句时,可以在结果区看到result.
workspace 工作区就是一系列的语句集合,可以用workspace来组织你的Query. 你可以创建很多workspace, 但是只有一个是处于激活状态。
history 可以记录你之前运行过的query语句。每在Query Console中执行一次,它变可以历史记录存档。点击任意存档,可以恢复当时的query。
content source 概念同数据库,query console 可以自动为Marklogic构建可用的content sources
qConsole使用
创建query
- 创建workspace
点击右上角的workspace下拉按钮,新建一个workspace.
- 添加query
点击左上角“+”,打开一个新的query编辑界面
- 重命名
双击query或者workspace的名字,可以重命名
- 选择查询语言
Query Type的下拉列表可以选择查询的方式,Marklogic 8 支持以下几种查询语言:
- JavaScript
- XQuery
- SQL
- SPARQL Query
- SPARQL Update
运行Query
- 选择content source
每一次运行query,都应选择正确的content soure. 本例中,你可以选择任意的content source.
- 点击 “Run”
- 选择结果格式
看历史query
每次修改与运行query,qConsole都会将运行脚本与执行时间存档。只有运行过的脚本才会被保存,只有修改过的代码才会生成新的历史记录。qConsole最多保存50条历史记录。
分析Query
qConsole可以分析当前运行query的性能。
浏览数据库
- 从content source中选择一个数据库
- 点击右边的 Explore ,在结果区将展示这个数据库中的文件
- 点击蓝色的文件URI链接,会直接打开此文档
- 来回切换窗口
Marklogic基本概念
摘要:如果之前有学习过SQL,应该了解一些数据库的基本概念。本节将帮助您更容易理解Marklogic中的一些概念。
术语
SQL术语 | Marklogic术语 | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/XML文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,Marklogic不支持 |
- 数据库 : 一个Marklogic中可以建立多个数据库。每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
- 文档 : 文档是Marklogic中的最核心的概念,是其核心单元,我们可以将文档类比成关系型数据库中的每一行数据。多个键及其关联的值有序的放置在一起就是文档。
- 集合 : 集合就是一组文档的组合。如果将文档类比成数据库中的行,那么集合就可以类比成数据库的表。在Marklogic中的集合是无模式的,也就是说集合中存储的文档的结构可以是不同的。
- 元数据 : 描述数据库存储数据信息的数据。
举例
id | category | title | author | pubDate | pages | price |
---|---|---|---|---|---|---|
1010596200 | 编程 | Java编程思想 | 埃克尔 | 2007-6-1 | 880 | 30.0 |
1010696100 | 文学 | 红楼梦 | 曹雪芹,高鹗 | 2012-9-1 | 1606 | 41.5 |
tables表的数据可用如下两个XML文档存储:
<code class="language-xml hljs has-numbering"> <span class="hljs-tag"><<span class="hljs-title">book</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"1010596200"</span> <span class="hljs-attribute">category</span>=<span class="hljs-value">"编程"</span>></span> <span class="hljs-tag"><<span class="hljs-title">title</span>></span>Java编程思想<span class="hljs-tag"></<span class="hljs-title">title</span>></span> <span class="hljs-tag"><<span class="hljs-title">author</span>></span>埃克尔<span class="hljs-tag"></<span class="hljs-title">author</span>></span> <span class="hljs-tag"><<span class="hljs-title">pubDate</span>></span>2007-6-1<span class="hljs-tag"></<span class="hljs-title">pubDate</span>></span> <span class="hljs-tag"><<span class="hljs-title">pages</span>></span>880<span class="hljs-tag"></<span class="hljs-title">pages</span>></span> <span class="hljs-tag"><<span class="hljs-title">price</span>></span>30.0<span class="hljs-tag"></<span class="hljs-title">price</span>></span> <span class="hljs-tag"></<span class="hljs-title">book</span>></span></code>
<code class="language-xml hljs has-numbering"> <span class="hljs-tag"><<span class="hljs-title">book</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"1010696100"</span> <span class="hljs-attribute">category</span>=<span class="hljs-value">"文学"</span>></span> <span class="hljs-tag"><<span class="hljs-title">title</span>></span>红楼梦<span class="hljs-tag"></<span class="hljs-title">title</span>></span> <span class="hljs-tag"><<span class="hljs-title">author</span>></span> <span class="hljs-tag"><<span class="hljs-title">firstAuthor</span>></span>曹雪芹<span class="hljs-tag"></<span class="hljs-title">firstAuthor</span>></span> <span class="hljs-tag"><<span class="hljs-title">secondAuthor</span>></span>高鹗<span class="hljs-tag"></<span class="hljs-title">secondAuthor</span>></span> <span class="hljs-tag"></<span class="hljs-title">author</span>></span> <span class="hljs-tag"><<span class="hljs-title">pubDate</span>></span>2012-9-1<span class="hljs-tag"></<span class="hljs-title">pubDate</span>></span> <span class="hljs-tag"><<span class="hljs-title">pages</span>></span>1606<span class="hljs-tag"></<span class="hljs-title">pages</span>></span> <span class="hljs-tag"><<span class="hljs-title">price</span>></span>41.5<span class="hljs-tag"></<span class="hljs-title">price</span>></span> <span class="hljs-tag"></<span class="hljs-title">book</span>> </span></code><h1 id="marklogic基本概念">Marklogic初学</h1><p>MarkLogic -> Groups ->Default -> App Servers -> App Server分为三类:</p><ol><li>Http</li><li>WebDAV</li><li>XDBC</li></ol><p>其中:</p><p>Root 就是数据库根目录</p><p>Module是放的xquery,而xquery其实就是view</p><p>Database才是放的数据,即xml文件</p><p> </p><p>//insert a xml into db</p><p>load.xqy</p><div style="overflow: visible ! important;" class="dp-highlighter bg_html"><div class="bar"><div class="tools"><strong>[html]</strong> <a target=_blank href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="ViewSource" title="view plain">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a target=_blank target="_blank" href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="CopyToClipboard" title="copy">copy</a></span><div id="FRO1805242100" style="position: relative ! important; left: 514px; top: 870px; width: 22px ! important; height: 12px; z-index: 1805242098 ! important;"><div style="cursor: w-resize ! important; width: 2px ! important; height: 12px ! important; overflow: hidden ! important; background-color: rgb(0, 153, 0) ! important; float: right ! important; z-index: 1805242099 ! important;">⃕</div></div><span class="tracking-ad" data-mod="popu_169"> <a target=_blank target="_blank" href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="PrintSource" title="print">print</a></span><a target=_blank href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="About" title="?">?</a></div></div><ol class="dp-xml" start="1"><li class="alt"><span><span>xquery version "1.0-ml"; </span></span></li><li><span>(: load.xqy :) </span></li><li class="alt"><span>xdmp:document-insert("books.xml", </span></li><li><span><span class="tag"><</span><span class="tag-name">books</span><span> </span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.marklogic.com/ns/gs-books"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">book</span><span> </span><span class="attribute">bookid</span><span>=</span><span class="attribute-value">"1"</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"><</span><span class="tag-name">title</span><span class="tag">></span><span>A Quick Path to an Application</span><span class="tag"></</span><span class="tag-name">title</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">author</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"><</span><span class="tag-name">last</span><span class="tag">></span><span>Smith</span><span class="tag"></</span><span class="tag-name">last</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">first</span><span class="tag">></span><span>Jim</span><span class="tag"></</span><span class="tag-name">first</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"></</span><span class="tag-name">author</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">publisher</span><span class="tag">></span><span>Scribblers Press</span><span class="tag"></</span><span class="tag-name">publisher</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"><</span><span class="tag-name">isbn</span><span class="tag">></span><span>1494-3930392-3</span><span class="tag"></</span><span class="tag-name">isbn</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">abstract</span><span class="tag">></span><span>This book describes in detail the power of how to use </span></span></li><li><span>XQuery to build powerful web applications that are built on the </span></li><li class="alt"><span>MarkLogic Server platform.<span class="tag"></</span><span class="tag-name">abstract</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"></</span><span class="tag-name">book</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">books</span><span class="tag">></span><span> </span></span></li><li><span>), </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">html</span><span> </span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.w3.org/1999/xhtml"</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"><</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">title</span><span class="tag">></span><span>Database loaded</span><span class="tag"></</span><span class="tag-name">title</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"></</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"><</span><span class="tag-name">b</span><span class="tag">></span><span>Source XML Loaded</span><span class="tag"></</span><span class="tag-name">b</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">p</span><span class="tag">></span><span>The source XML has been successfully loaded into the database</span><span class="tag"></</span><span class="tag-name">p</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"></</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">html</span><span class="tag">></span><span> </span></span></li></ol></div><p> </p>// get xml from db dump.xqy<div style="overflow: visible ! important;" class="dp-highlighter bg_html"><div class="bar"><div class="tools"><strong>[html]</strong> <a target=_blank href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="ViewSource" title="view plain">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a target=_blank target="_blank" href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="CopyToClipboard" title="copy">copy</a></span><div id="FRO180258344" style="position: relative ! important; left: 514px; top: 1519px; width: 22px ! important; height: 12px; z-index: 180258342 ! important;"><div style="cursor: w-resize ! important; width: 2px ! important; height: 12px ! important; overflow: hidden ! important; background-color: rgb(0, 153, 0) ! important; float: right ! important; z-index: 180258343 ! important;">⃕</div></div><span class="tracking-ad" data-mod="popu_169"> <a target=_blank target="_blank" href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="PrintSource" title="print">print</a></span><a target=_blank href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="About" title="?">?</a></div></div><ol class="dp-xml" start="1"><li class="alt"><span><span>xquery version "1.0-ml"; </span></span></li><li><span>(: dump.xqy :) </span></li><li class="alt"><span>declare namespace <span class="attribute">bk</span><span> = </span><span class="attribute-value">"http://www.marklogic.com/ns/gs-books"</span><span>; </span></span></li><li><span><span class="tag"><</span><span class="tag-name">html</span><span> </span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.w3.org/1999/xhtml"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"><</span><span class="tag-name">title</span><span class="tag">></span><span>Database dump</span><span class="tag"></</span><span class="tag-name">title</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"><</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">b</span><span class="tag">></span><span>XML Content</span><span class="tag"></</span><span class="tag-name">b</span><span class="tag">></span><span> </span></span></li><li><span>{ </span></li><li class="alt"><span>for $book in doc("books.xml")/bk:books/bk:book </span></li><li><span>return </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">pre</span><span class="tag">></span><span> </span></span></li><li><span>Title: { $book/bk:title/text() } </span></li><li class="alt"><span>Author: { ($book/bk:author/bk:first/text(), " ", </span></li><li><span>$book/bk:author/bk:last/text()) } </span></li><li class="alt"><span>Publisher: { $book/bk:publisher/text() } </span></li><li><span><span class="tag"></</span><span class="tag-name">pre</span><span class="tag">></span><span> </span></span></li><li class="alt"><span>} </span></li><li><span><span class="tag"><</span><span class="tag-name">a</span><span> </span><span class="attribute">href</span><span>=</span><span class="attribute-value">"update-form.xqy"</span><span class="tag">></span><span>Update Publisher</span><span class="tag"></</span><span class="tag-name">a</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"></</span><span class="tag-name">html</span><span class="tag">></span><span> </span></span></li></ol></div> update-form.xqy<div style="overflow: visible ! important;" class="dp-highlighter bg_html"><div class="bar"><div class="tools"><strong>[html]</strong> <a target=_blank href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="ViewSource" title="view plain">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a target=_blank target="_blank" href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="CopyToClipboard" title="copy">copy</a></span><div id="FRO633685906" style="position: relative ! important; left: 514px; top: 2052px; width: 22px ! important; height: 12px; z-index: 633685904 ! important;"><div style="cursor: w-resize ! important; width: 2px ! important; height: 12px ! important; overflow: hidden ! important; background-color: rgb(0, 153, 0) ! important; float: right ! important; z-index: 633685905 ! important;">⃕</div></div><span class="tracking-ad" data-mod="popu_169"> <a target=_blank target="_blank" href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="PrintSource" title="print">print</a></span><a target=_blank href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="About" title="?">?</a></div></div><ol class="dp-xml" start="1"><li class="alt"><span><span>xquery version "1.0-ml"; </span></span></li><li><span>(: update-form.xqy :) </span></li><li class="alt"><span>declare namespace <span class="attribute">bk</span><span>=</span><span class="attribute-value">"http://www.marklogic.com/ns/gs-books"</span><span>; </span></span></li><li><span><span class="tag"><</span><span class="tag-name">html</span><span> </span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.w3.org/1999/xhtml"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"><</span><span class="tag-name">title</span><span class="tag">></span><span>Change Publisher</span><span class="tag"></</span><span class="tag-name">title</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"><</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li class="alt"><span>{ </span></li><li><span>let $book <span class="attribute">:</span><span>= </span><span class="attribute-value">doc</span><span>("books.xml")/bk:books/bk:book[1] </span></span></li><li class="alt"><span>return </span></li><li><span><span class="tag"><</span><span class="tag-name">form</span><span> </span><span class="attribute">action</span><span>=</span><span class="attribute-value">"update-write.xqy"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"hidden"</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"bookid"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"{ $book/@bookid }"</span><span class="tag">/></span><span> </span></span></li><li><span><span class="tag"><</span><span class="tag-name">p</span><span class="tag">></span><span class="tag"><</span><span class="tag-name">b</span><span class="tag">></span><span> </span></span></li><li class="alt"><span>Change publisher for book <span class="tag"><</span><span class="tag-name">i</span><span class="tag">></span><span>{ $book/bk:title/text() }</span><span class="tag"></</span><span class="tag-name">i</span><span class="tag">></span><span>: </span></span></li><li><span><span class="tag"></</span><span class="tag-name">b</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">p</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text"</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"publisher"</span><span> </span></span></li><li><span><span class="attribute">value</span><span>=</span><span class="attribute-value">"{ $book/bk:publisher/text() }"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">input</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"submit"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"Update publisher"</span><span class="tag">/></span><span> </span></span></li><li><span><span class="tag"></</span><span class="tag-name">form</span><span class="tag">></span><span> </span></span></li><li class="alt"><span>} </span></li><li><span><span class="tag"></</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">html</span><span class="tag">></span><span> </span></span></li></ol></div> update-write.xqy<div style="overflow: visible ! important;" class="dp-highlighter bg_html"><div class="bar"><div class="tools"><strong>[html]</strong> <a target=_blank href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="ViewSource" title="view plain">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a target=_blank target="_blank" href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="CopyToClipboard" title="copy">copy</a></span><div id="FRO833859133" style="position: relative ! important; left: 514px; top: 2603px; width: 22px ! important; height: 12px; z-index: 833859131 ! important;"><div style="cursor: w-resize ! important; width: 2px ! important; height: 12px ! important; overflow: hidden ! important; background-color: rgb(0, 153, 0) ! important; float: right ! important; z-index: 833859132 ! important;">⃕</div></div><span class="tracking-ad" data-mod="popu_169"> <a target=_blank target="_blank" href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="PrintSource" title="print">print</a></span><a target=_blank href="http://blog.csdn.net/lein_wang/article/details/7755084#" class="About" title="?">?</a></div></div><ol class="dp-xml" start="1"><li class="alt"><span><span>xquery version "1.0-ml"; </span></span></li><li><span>(: update-write.xqy :) </span></li><li class="alt"><span>declare namespace <span class="attribute">bk</span><span>=</span><span class="attribute-value">"http://www.marklogic.com/ns/gs-books"</span><span>; </span></span></li><li><span>declare function local:updatePublisher() </span></li><li class="alt"><span>{ </span></li><li><span>if (doc("books.xml")) then </span></li><li class="alt"><span>let $bookid <span class="attribute">:</span><span>= </span><span class="attribute-value">xdmp</span><span>:get-request-field("bookid") </span></span></li><li><span>let $publisher <span class="attribute">:</span><span>= </span><span class="attribute-value">xdmp</span><span>:get-request-field("publisher") </span></span></li><li class="alt"><span>let $b <span class="attribute">:</span><span>= </span><span class="attribute-value">doc</span><span>("books.xml")/bk:books/bk:book[@</span><span class="attribute">bookid</span><span> = $bookid] </span></span></li><li><span>return </span></li><li class="alt"><span>if ($b) then </span></li><li><span>( </span></li><li class="alt"><span>xdmp:node-replace($b/bk:publisher, </span></li><li><span><span class="tag"><</span><span class="tag-name">bk:publisher</span><span class="tag">></span><span>{ $publisher }</span><span class="tag"></</span><span class="tag-name">bk:publisher</span><span class="tag">></span><span>) </span></span></li><li class="alt"><span>, </span></li><li><span>xdmp:redirect-response("dump.xqy") </span></li><li class="alt"><span>) </span></li><li><span>else </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">span</span><span class="tag">></span><span>Could not locate book with bookid { $bookid }.</span><span class="tag"></</span><span class="tag-name">span</span><span class="tag">></span><span> </span></span></li><li><span>else </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">span</span><span class="tag">></span><span>Unable to access parent XML document.</span><span class="tag"></</span><span class="tag-name">span</span><span class="tag">></span><span> </span></span></li><li><span>}; </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">html</span><span> </span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.w3.org/1999/xhtml"</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"><</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">title</span><span class="tag">></span><span>Update In Process</span><span class="tag"></</span><span class="tag-name">title</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"></</span><span class="tag-name">head</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li><span>Attempting to complete update and redirect browser to detail page. </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">p</span><span class="tag">></span><span> </span></span></li><li><span>If you are seeing this page, either the redirect has failed </span></li><li class="alt"><span>or the update has failed. The update has failed if there is </span></li><li><span>a reason provided below: </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">br</span><span class="tag">/></span><span> </span></span></li><li><span>{ local:updatePublisher() } </span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">p</span><span class="tag">></span><span> </span></span></li><li><span><span class="tag"></</span><span class="tag-name">body</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">html</span><span class="tag">></span><span> </span></span></li></ol></div>