??xml version="1.0" encoding="utf-8" standalone="yes"?>
d在给定的触发器(TriggerQ触发时执行。触发器可以通过几乎以下所有Ş式的l合方式q行创徏Q?br />
在一天中的Q意时刻(可以_到毫U)?br />
一周中特定的一些天?br />
一个月中特定的一些天?br />
一q中特定的一些天
不在日历列表中注册的一些天Q比如节假日Q?br />
循环特定的次数?br />
循环到特定的旉?br />
无限循环?br />
按照一定的旉间隔循环?br />
Job ExecutionQQ务执行)
• d是Q何实现简单Job接口的Java c,q样开发者能够执行Q何完成他们工作的d?br />
• dcȝ实例可以由Quartz实例化,也可以由你的E序框架实例化?br />
当触发器被触发时Q日E管理器会通知某个或者多个实CJobListener 或TriggerListener的对象(监听器可以是单的Java对象Q或者EJBs,或者JMS消息发布器,{等Q。这些监听器在Q务执行完毕后也会接到通知?br />
• d被完成后Q他们会q回一?#8220;d完成码(JobCompletionCodeQ?#8221;Q这?#8220;d完成?#8221;告知日程理器Q务执行的l果是成功还是失败。日E管理器会根据成功或者失败码来采取措施,比如Q立即重新执行Q务?br />
Job PersistenceQQ务持久化Q?/strong>
• Quartz设计中包括了一个JobStore接口Q这P实现q个接口的Jobcd以以多种机制实现Job的存储?br />
• 通过使用JDBCJobStore,所有的Jobs和Triggers被配|ؓ“non-volatile”(不轻?的方式。即Q通过JDBC存储在关pL据库中?br />
• 通过使用RAMJobStoreQ所有Jobs和Triggers被存储在RAM。因此,在程序执行中没有被持久化Q但q种方式的优点就是不需要外部数据库?br />
TransactionsQ事务)
• Quartz通过JobStoreCMTQJDBCJobStore的一个子c)可参与JTA事务?br />
• Quartz可以理JTA事务Q开始或者提交事务)?br />
ClusteringQ集)
• Fail-over.Q容错)
• Load balancing.Q负载均衡)
Listeners & Plug-InsQ监听器及插Ӟ
• 应用可以通过实现一个或者多个监听器接口来实现捕捉日E事Ӟ以监视或控制d/触发器的行ؓ?br />
• 可以通过插g的机制来扩展Quartz 的功能。例?记录d执行历史的日志,或者从文g中蝲入Q务和触发器的定义?
]]>
]]>
· XQuery对大写敏感
· XQuery的元素、属性以及变量必L合法的XML名称?
· XQuery字符串值可使用单引h双引受?
· XQuery变量?#8220;$”q跟随一个名U来q行定义QD例,$bookstore
· XQuery注释?:?)分割QD例,(: XQuery 注释 :)
XQuery 条g表达?/span>
"If-Then-Else"可以在XQuery中用?/span>
L下面的例子:
for $x in doc("books.xml")/bookstore/book
return if ($x/@category="CHILDREN")
then <child>{data($x/title)}</child>
else <adult>{data($x/title)}</adult>
h?If-Then-Else"的语法:if表达式后的圆括号是必需的。else也是必需的,不过仅仅?#8220;else ()”也是可以的?/span>
上面的例子的l果Q?/span>
<adult>Everyday Italian</adult>
<child>Harry Potter</child>
<adult>Learning XML</adult>
<adult>XQuery Kick Start</adult>
XQuery 比较
?span lang="EN-US">XQuery中,有两U方法来比较倹{?br />
1. 通用比较Q?span lang="EN-US">=, !=, <, <=, >, >=
2. 值的比较Qeq、ne、lt、le、gt、ge
L下面?span lang="EN-US">XQuery表达式:
$bookstore//book/@q > 10
如果q属性的值大?span lang="EN-US">10Q上面的表达式的q回gؓtrue?span lang="EN-US">
$bookstore//book/@q gt 10
如果仅返回一?span lang="EN-US">qQ且它的值大?span lang="EN-US">10Q那么表辑ּq回true。如果不止一?span lang="EN-US">q被返回,则会发生错误?span lang="EN-US">
向结果添加元素和属?/span>
正如在前面一节看到的Q我们可以在l果中引用输入文件中的元素和属性:
for $x in doc("books.xml")/bookstore/book/title
order by $x
return $x
上面的XQuery表达式会在结果中引用title元素和lang属性,像q样Q?
<title lang="en">Everyday Italian</title>
<title lang="en">Harry Potter</title>
<title lang="en">Learning XML</title>
<title lang="en">XQuery Kick Start</title>
以上XQuery表达式返回title元素的方式和它们在输入文档中被描q的方式的相同的?/span>
现在我们要向l果d我们自己的元素和属性!
dHTML元素和文?/span>
现在Q我们要向结果添加HTML元素。我们会把结果放在一个HTML列表?- Now, we want to add some HTML elements to the result. We will put the result in an HTML list - together with some text:
<html>
<body>
<h1>Bookstore</h1>
<ul>
{
for $x in doc("books.xml")/bookstore/book
order by $x/title
return <li>{data($x/title)}. Category: {data($x/@category)}</li>>
}
</ul>
</body>
</html
以上XQuery表达式会生成下面的结果:
<html>
<body>
<h1>Bookstore</h1>
<ul>
<li>Everyday Italian. Category: COOKING</li>
<li>Harry Potter. Category: CHILDREN</li>
<li>Learning XML. Category: WEB</li>
<li>XQuery Kick Start. Category: WEB</li>
</ul>
</body>
</html>
选择和过滤元?/span>
正如在前面的章节看到的,我们使用路径表达式或FLWOR表达式来选去和过滤元素?/span>
L下面的FLWOR表达式:
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
for
Q可选) 向每个由in表达式返回的目捆绑一个变?/span>
let
Q可选)
where
Q可选) 讑֮一个条?/span>
order by
Q可选) 讑֮l果的排列顺?/span>
return
规定在结果中q回的内?
for 语句
for语句可将变量捆绑到由in表达式返回的每个目。for可生P代。在同一个FLWOR表达式中可存在多重for语句?/span>
如需在一个for语句中@环指定的ơ数Q您可?em>关键词toQ?
for $x in (1 to 5)
return <test>{$x}</test>
l果Q?/span>
<test>1</test>
<test>2</test>
<test>3</test>
<test>4</test>
<test>5</test>
关键词at可被用来计算q代Q?/span>
for $x at $i in doc("books.xml")/bookstore/book/title
return <book>{$i}. {data($x)}</book>
l果Q?/span>
<book>1. Everyday Italian</book>
<book>2. Harry Potter</book>
<book>3. XQuery Kick Start</book>
<book>4. Learning XML</book>
在for语句中同?em>允许多个in表达?/em>。请使用逗号来分割每一个in表达式:
for $x in (10,20), $y in (100,200)
return <test>x={$x} and y={$y}</test>
l果Q?/span>
<test>x=10 and y=100</test>
<test>x=10 and y=200</test>
<test>x=20 and y=100</test>
<test>x=20 and y=200</test>
let 语句
let语句可完成变量分配,q可避免多次重复相同的表辑ּ。let语句不回Dq代?/span>
let $x := (1 to 5)
return <test>{$x}</test>
l果
<test>1 2 3 4 5</test>
where 语句
where语句用于为结果设定一个或多个条gQcriteriaQ?/span>
where $x/price>30 and $x/price<100
order by 语句
order by语句用于规定l果的排序次序。此处,我们要根据category和title来对l果q行排序Q?/span>
for $x in doc("books.xml")/bookstore/book
order by $x/@category, $x/title
return $x/title
l果Q?/span>
<title lang="en">Harry Potter</title>
<title lang="en">Everyday Italian</title>
<title lang="en">Learning XML</title>
<title lang="en">XQuery Kick Start</title>
return 语句Q?/span>
return语句规定要返回的内容?/span>
for $x in doc("books.xml")/bookstore/book
return $x/title
l果Q?/span>
<title lang="en">Everyday Italian</title>
<title lang="en">Harry Potter</title>
<title lang="en">XQuery Kick Start</title>
<title lang="en">Learning XML</title>
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
一、函?/span>
XQuery使用函数来提取XML文档中的数据?/span>
doc()用于打开"books.xml"文gQ?/span>
doc("books.xml")
二、\径表辑ּ
XQuery使用路径表达式在XML文档中通过元素q行D?/span>
下面的\径表辑ּ用于?books.xml"文g中选取所有的title元素Q?/span>
doc("books.xml")/bookstore/book/title
(/bookstore选取bookstore元素Q?book选取bookstore元素下的所有book元素Q?title选取每个book元素下的所有title元素)
上面的XQuery可提取以下数据:
<title lang="en">Everyday Italian</title>
<title lang="en">Harry Potter</title>
<title lang="en">XQuery Kick Start</title>
<title lang="en">Learning XML</title>
三、谓?/span>
XQuery使用谓语来限定从XML文档所提取的数据?/span>
下面的谓语用于选取bookstore元素下的所有book元素Qƈ且所选取的book元素下的price元素的值必d?0Q?/span>
doc("books.xml")/bookstore/book[price<30]
上面的XQuery可提取到下面的数据:
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
FLWOR?span lang="EN-US">"For, Let, Where, Order by, Return"的只取首字母~写?/span>
for语句?span lang="EN-US">bookstore元素下的所?span lang="EN-US">book
元素提取到名?span lang="EN-US">$x的变量中?span lang="EN-US">where语句选取?span lang="EN-US">price元素值大?span lang="EN-US">30?span lang="EN-US">book元素?span lang="EN-US">
order by语句定义了排序次序。将Ҏtitle元素q行排序?span lang="EN-US">
return语句规定q回什么内宏V在此返回的?span lang="EN-US">title元素?br />
L下面q个路径表达式:
doc("books.xml")/bookstore/book[price>30]/title
上面q个表达式可选取bookstore元素下的book元素下所有的title元素Qƈ且其中的price元素的值必d?0?/span>
下面q个FLWOR表达式所选取的数据和上面的\径表辑ּ是相同的Q?/span>
for $x in doc("books.xml")/bookstore/book
where $x/price>30
return $x/title
l果是:
<title lang="en">XQuery Kick Start</title>
<title lang="en">Learning XML</title>
通过FLWORQ您可以对结果进行排序:
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
上面?span lang="EN-US">XQuery表达式的l果Q?span lang="EN-US">
<title lang="en">Learning XML</title>
<title lang="en">XQuery Kick Start</title>
在一个HTML列表中提交结?/span>
L下面的XQuery FLWOR表达式:
for $x in doc("books.xml")/bookstore/book/title
order by $x
return $x
上面的表辑ּ会选取bookstore元素下的book元素下的所有title元素Qƈ以字母顺序返回title元素?/span>
现在Q我们希望用HTML列表列出我们的书店中所有的书目。我们向FLWOR表达式添?lt;ul>?lt;li>标签Q?/span>
<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{$x}</li>
}
</ul>
以上代码的结果:
<ul>
<li><title lang="en">Everyday Italian</title></li>
<li><title lang="en">Harry Potter</title></li>
<li><title lang="en">Learning XML</title></li>
<li><title lang="en">XQuery Kick Start</title></li>
</ul>
现在我们希望去除title元素Q而仅仅显Ctitle元素内的数据?/span>
<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{data($x)}</li>
}
</ul>
l果是一个HTML列表Q?/span>
<ul>
<li>Everyday Italian</li>
<li>Harry Potter</li>
<li>Learning XML</li>
<li>XQuery Kick Start</li>
</ul>
import java.io.IOException;
import java.util.Properties;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import net.sf.saxon.Configuration;
import net.sf.saxon.dom.*;
import net.sf.saxon.query.DynamicQueryContext;
import net.sf.saxon.query.StaticQueryContext;
import net.sf.saxon.query.XQueryExpression;
import net.sf.saxon.trans.XPathException;
public class XqueryTest {
/**
* 执行查询
*/
public static void select(){
//文g
String fileString = "src/study/xquery/cd_catalog.xml";
//查询语句
String query = " for $s in //CD/TITLE "
+ " return $s";
//生文档对象
Document document = getDocument(fileString);
Configuration configuration = new Configuration();
StaticQueryContext context = new StaticQueryContext(configuration, false);
//查询表达式对?br />
XQueryExpression expression = null;
try {
expression = context.compileQuery(query);
DynamicQueryContext context2 = new DynamicQueryContext(configuration);
context2.setContextItem(new DocumentWrapper(document,null,configuration));
final Properties props = new Properties();
props.setProperty(OutputKeys.METHOD, "xml");
props.setProperty(OutputKeys.INDENT, "yes");
//执行查询Qƈ输出查询l果
expression.run(context2, new StreamResult(System.out), props);
} catch (XPathException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 生文档对象
*
* @param xml 文g?br />
* @return
*/
public static Document getDocument(String xml){
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
Document document = null;
try {
builder = builderFactory.newDocumentBuilder();
document = builder.parse(xml);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
document.normalize();
return document;
}
/**
* 输入生成的文档内?br />
*
* @param doc
*/
public static void output(Document doc){
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = null;
try {
transformer = factory.newTransformer();
Properties properties = transformer.getOutputProperties();
properties.setProperty(OutputKeys.INDENT, "yes");
properties.setProperty(OutputKeys.ENCODING, "GB2312");
properties.setProperty(OutputKeys.METHOD, "xml");
properties.setProperty(OutputKeys.VERSION, "1.0");
transformer.setOutputProperties(properties);
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
select();
}
}