再利用 ODF 和 Word 2007 内容
现在,在数据库中有了 OpenOffice 和 Word 2007 文档的内容,您需要再利用该文档,将它用于网站。这就是我们例子中市场部门必须要做的事情。清单 5 显示了用于 ODF 的代码,可以将该代码保存为 “odfrepurpose.php”,以便后面引用。从 输出(一个 HTML 片段)中,很容易看到如何将这个文档重新格式化为一个新闻提要,或者将它并入到一个 Ajax 应用程序中!
清单 5. 将 ODF 格式(opendoc.odt)再利用到一个简单的 HTML 片段中
<?php $user = "db2admin"; $password = "secret"; $db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=ODF;" . "HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;", $user, $password); echo $user." Connected\n"; $xqry = <<<TXT values( XMLSERIALIZE( XMLQUERY(' declare boundary-space strip; declare namespace text0="urn:oasis:names:tc:opendocument:xmlns:text:1.0"; declare namespace office0="urn:oasis:names:tc:opendocument:xmlns:office:1.0"; for \$t0 in db2-fn:xmlcolumn("DB2ADMIN.DOCUMENT.DOC") /office0:document-content/office0:body let \$p0 := \$body0/office0:text/text0:p let \$h0 := \$body0/office0:text/text0:h where fn:exists(\$p0) or \$h0:h/@text:style-name ="Heading_20_2" return if ( fn:exists( \$style ) ) then if (\$h0:h/@text:style-name ="Heading_20_2" ) then <h1>{\$txt}</h1> else () else <p>{\$txt}</p>') as VARCHAR(2000))) TXT; $result=$db->query( $xqry ); $arr = $result->fetch(); echo $arr[1]; ?>
清单 5.1 显示了再利用 Word 2007 的代码,可以将该代码保存为 “msrepurpose.php”,以便后面引用。从 输出(一个 HTML 片段)中,很容易看到如何将这个文档重新格式化为一个新闻提要,或者将它并入到一个 Ajax 应用程序中!
清单 5.1 将 Word 2007 格式(submit.docx)再利用到一个简单的 HTML 片段中
<?php $user = "db2admin"; $password = "secret"; $db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=ODF;" . "HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;", $user, $password); echo $user." Connected\n"; $xqry = <<<TXT values( XMLSERIALIZE( XMLQUERY(' declare boundary-space strip; declare namespace text0= "urn:oasis:names:tc:opendocument:xmlns:text:1.0"; declare namespace office0= "urn:oasis:names:tc:opendocument:xmlns:office:1.0"; for \$t0 in db2-fn:xmlcolumn("DB2ADMIN.DOCUMENT.DOC") /office0:document-content/office0:body/office0:text let \$p := (for \$pp in \$t0/text0:p return <p>{\$pp/text()}</p>) let \$h := (for \$hh in \$t0/text0:h[@text0:style-name= "Heading_20_2"] return <hl>{\$hh/text()}</hl>) return (\$h,\$p)') as varchar(3000))) TXT; echo "\n"; $result=$db->query( $xqry ); $arr = $result->fetch(); echo $arr[1]; ?>
要运行该代码,输入:
php.exe msrepurpose.php
提示:在构建这个 XQuery 语句时,我借助了 DB2 Developer Workbench XQuery 支持。我设法通过点击的方式构建这个查询。这样节省了不少时间。
现在您也许会问,为什么不直接将它保存为 HTML 呢?XML 的生成会危害原始文档的完整性,并且会丢失 MS Office 特性。然而,文档的确小了很多,而且仍然可以用 XQuery 对它进行再利用,就像对待 Word 2007 文件格式一样。随着文档变得越来越大、越来越多(例如在大型会议中),您希望将这个逻辑应用到储存库中每个文档的每个部分。于是 XQuery 的威力就表现出来了!和 SQL 一样,XQuery 使您通过一个查询处理一组文档。实际上,如果您愿意,也可以使用 SQL 查询得到同样的结果,因为在 DB2 中这两种语言可以互换。
下面的清单显示了 odfrepurpose.php 或 msrepurpose.php 的结果:
清单 6. 输出
结束语db2admin Connected <h1>Introduction to Web 2.0</h1><p>This is a document that will impress upon ...</p><h1>Abstract</h1><p>The nature of the industry is a gain turning to the browser ...</p>
本文讨论的技巧在内容管理和文档管理解决方案中很有用。希望您已经发现,通过 IBM DB2 pureXML 特性使用和再利用 OpenOffice 和 MS Office 2007 文档十分容易。实际上这个过程不需要很多代码,这一点有助于取得好的性能。之后,考虑索引这些 XML 文档,以进一步利用 pureXML 混合存储特性的优点。
欲更深入地学习 XQuery,可以使用 DB2 Developer Workbench 中的 XQuery 编辑器,或者浏览 DB2 9: pureXML Overview and Fast Start (IBM Redbooks)。请访问 pecl.php.net 上的 IBM_PDO 站点,了解关于 PDO 的更多信息。