reference:一份不太简短的 LATEX 2ε 介绍







reference:一份不太简短的 LATEX 2ε 介绍







本文摘自:MECE分析法
MECE,是Mutually Exclusive Collectively Exhaustive,中文意思是“相互独立,完全穷尽”。 也就是对于一个重大的议题,能够做到不重叠、不遗漏的分类,而且能够藉此有效把握问题的核心,并解决问题的方法。
所谓的不遗漏、不重叠指在将某个整体(不论是客观存在的还是概念性的整体)划分为不同的部分时,必须保证划分后的各部门符合以下要求:
通常的做法分两种:
对于分析问题的标准程序:
收集信息=>描述发现=>得出结论=>提出方案
MECE分析法主要有两个步骤
步骤一、确认问题是什么?
步骤二、寻找MECE的切入点。

这篇文章将一行一行的解读wsbpel2.0的源码。
相关xsd语法问题,请参见XSD学习笔记完整版
wsbpel2.0源码:ws-bpel_executable.xsd
1 | <xsd:schema xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable" |
声明命名空间http://docs.oasis-open.org/wsbpel/2.0/process/executable,没有前缀。
引入http://www.w3.org/2001/XMLSchema的语素并以xsd为前缀。
elementFormDefault="qualified"表示所有元素都必须加上前缀以表明其命名空间。
blockDefault="#all"表示默认情况下不能通过派生类代替原类型。
1 | <xsd:annotation> |
赠送了一个简单的文档说明。
1 | <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> |
引入http://www.w3.org/2001/xml.xsd的xml语素,前缀默认为xml。
1 | <xsd:element name="process" type="tProcess"> |
BPEL的根元素,此处没有定义任何内容,内部元素属性通过type=”tProcess”引入。
1 | <xsd:complexType name="tProcess"> |
首先是一个名为tExtensibleElements的扩展,先放一下往后看。
一个sequence,包括extensions,import,partnerLinks,messageExchanges,variables,correlationSets,faultHandlers,eventHandlers,还有一个activity的group,这里全部是ref,我们知道大概有些啥就行了,后边肯定会有详细的定义,先往后看吧。
接着是一堆attribute,包括process的
1 | <xsd:complexType name="tExtensibleElements"> |
tExtensibleElements这个扩展马上就来了,可以看到,扩展除了0至多个documentation(后边再讲),还有
1 | <xsd:element name="documentation" type="tDocumentation"/> |
documentation中:
1 | <xsd:group name="activity"> |
定义了一个activity的group,用于在其他地方引用,比如说通过tProcess引用到process里边。
一个activity可以是以下元素中的一个,没写到的看后边源码解读好了:
| 活动名称 | 释义 |
|---|---|
| assign | 活动的作用是用新的数据来更新变量的值。Assign活动可以包括任意数量的基本复制操作。 |
| compensate | 通过该活动做一些补偿动作,通常需要和scope联合使用。只能从故障处理程序或另一个补偿处理活动中调用这个活动。补偿处理程序只能被调用一次。 |
| compensateScope | |
| empty | 无所事事,比如在一个错误发生后可以不做反应来消除这个错误 |
| exit | 该活动用于立刻终止业务流程实例。所有当前运行的活动必须被立刻终止。不用引用任何终点处理、错误处理或者补偿行为。 |
| extensionActivity | |
| flow | 可以描述更为复杂的活动执行顺序。我们可以利用flow指定一个或多个并行执行的活动。为了定义任意的控制结构,可以在并行的活动中使用链接。 |
| forEach | |
| if | |
| invoke | 活动允许业务流程同步或异步调用由合作伙伴提供的服务,服务实现可以是单向或请求-响应操作。Invoke活动使用“partnerLink”来引用伙伴服务。同过“portType”和“operation”指定相应的WSDL接口和操作。 |
| pick | 活动会等待一组相互排斥事件中的一个事件的发生,然后执行与发生的事件相关联的活动。它会阻塞业务流程执行,以等待某一特定的事件发生,比如接收到一个合适的消息或超时警报响起。当其中任何一个事件被触发后,业务流程就会继续执行,pick也随即完成了,不会再等待其他事件的发生。 |
| receive | 活动从流程的外部伙伴那获取数据,并将其保存到流程变量。通常一个Receive是一个流程的初始点,它会阻塞执行直到匹配的消息的到达。 |
| repeatUntil | |
| reply | 活动发送消息给伙伴来应答通过receive活动所接收到的消息。receive和reply的组合对应着WSDL portType上定义的一个请求-响应操作。如果receive活动对应着一个单向(one-way)操作,则不能在流程中定义对应的reply活动。 |
| rethrow | |
| scope | 使用这个结构可以将一组活动组织在一起作为一个处理单位。通过这个组织方法多个活动可以使用同一个故障处理、事故处理和补偿处理。通过补偿处理BPEL可以处理长时间的处理。 |
| sequence | 定义一组按顺序先后执行的活动。执行顺序是sequence活动中嵌套活动的先后顺序。当sequence中的最后一个活动完成后,该sequence活动也就完成了。 |
| throw | 提示一个错误,一个故障处理可以处理这样的错误。假如一个错误不被处理的话它最终到达最高层后导致过程的终止 |
| validate | |
| wait | 活动会暂停流程执行,等待一段给定的时间或等到某一时刻才继续运行。在WebSphere Process Server 6.0中,开发者可以非常灵活地指定wait中的到期条件,比如等待多少秒,等到特定的一个日期,或是使用内置的日期表现法。也可以使用Java代码来动态指定等待时间。 |
| while | 继承于传统的结构化编程思想,提供了while-do循环结构的支持。它可以包含一个或多个活动。它指定反复执行其内部活动,直到成功条件不被满足为止。在WPS中允许其使用Java代码来描述条件表达式。 |
1 | <xsd:element name="extensions" type="tExtensions"/> |
一个extensions由1到多个extension组成。
extension扩展自tExtensibleElements,增加了namespace和mustUnderstand两个属性。
1 | <xsd:element name="import" type="tImport"/> |
BPEL允许import,import元素在tExtensibleElements的基础上,增加namespace、location、importType三个属性,和xsd的import类似。
1 | <xsd:element name="partnerLinks" type="tPartnerLinks"/> |
和extensions相似,partnerLinks由1到多个partnerLink组成,同时支持tExtensibleElements扩展。
partnerLink在tExtensibleElements的基础上,增加了以下5个属性
1 | <xsd:element name="messageExchanges" type="tMessageExchanges"/> |
和extensions相似,messageExchanges由1到多个messageExchange组成,同时支持tExtensibleElements扩展。
messageExchange在tExtensibleElements的基础上,增加了一个属性
1 | <xsd:element name="variables" type="tVariables"/> |
和extensions相似,variables由1到多个variable组成,同时支持tExtensibleElements扩展。
variable在tExtensibleElements的基础上,增加了一个元素
增加了四个属性
1 | <xsd:simpleType name="BPELVariableName"> |
bpel变量的一个限制,BPELVariableName需要满足xsd:NCName限制,不能以.开头,且长度大于等于一个字符。
1 | <xsd:element name="correlationSets" type="tCorrelationSets"/> |
和extensions相似,correlationSets由1到多个correlationSet组成,同时支持tExtensibleElements扩展。
correlationSet在tExtensibleElements的基础上,增加了2个属性
1 | <xsd:simpleType name="QNames"> |
QNames就是一个QName的list,最少1个,默认空格分割。
1 | <xsd:element name="faultHandlers" type="tFaultHandlers"/> |
faultHandlers,听名字就知道是干啥的了,同样支持tExtensibleElements扩展,由2种元素的sequence组成:
1 | <xsd:element name="catch" type="tCatch"> |
catch扩展自tActivityContainer,包含4个属性,对catch做了限定:
1 | <xsd:element name="catchAll" type="tActivityContainer"> |
不同于catch,catchAll没有那么多属性(我全都要),就是tActivityContainer本尊,扩展自tExtensibleElements,同时包含一个activity的sequence。
1 | <xsd:element name="eventHandlers" type="tEventHandlers"/> |
eventHandlers基于tExtensibleElements扩展,由2种元素的sequence组成:
1 | <xsd:element name="onEvent" type="tOnEvent"/> |
onEvent元素基于tOnMsgCommon进行扩展,包含一个element sequence:
2个attribute:
1 | <xsd:complexType name="tOnMsgCommon"> |
tOnMsgCommon这个complexType同样支持tExtensibleElements扩展,包含由两类element组成的sequence:
同时还引入了5种属性:
1 | <xsd:complexType name="tCorrelations"> |
tCorrelations基于tExtensibleElements扩展,由1至多个correlation的sequence组成。
tCorrelation同样基于tExtensibleElements扩展,在此之上还定义了两个属性:
1 | <xsd:complexType name="tOnAlarmEvent"> |
tOnAlarmEvent基于tExtensibleElements扩展,由1个group:forOrUntilGroup 和 0或1个element:repeatEvery组成的sequence,或者1个element:repeatEvery,再加上一个scope组成的sequence组成。
三个元素都通过ref引用,可以继续往后看定义。
1 | <xsd:group name="forOrUntilGroup"> |
可以看到,forOrUntilGroup还真就是for或者until两个元素中选一个。这两个东西又分别通过tDuration-expr,tDeadline-expr来定义。
刚好element:repeatEvery也在这后边,一起讲了吧,同样通过tDuration-expr来定义。
1 | <xsd:complexType name="tActivity"> |
一看是activity的type,感觉应该出现过,其实并没有,大概是后边会用到吧。
同样基于tExtensibleElements扩展(啥都要tExtensibleElements扩展一下,这兼容性也太强了吧),包含两个元素组成的sequence
另外还有俩属性:
1 | <xsd:element name="targets" type="tTargets"/> |
targets基于tExtensibleElements进行扩展,包含两个元素组成的sequence:
1 | <xsd:element name="joinCondition" type="tCondition"/> |
这玩意儿的定义在tCondition里边,其实装的就是几乎啥都可以写的混合内容。
1 | <xsd:element name="target" type="tTarget"/> |
tTarget这个东西是一个机遇tExtensibleElements扩展的元素,就增加了一个元素
1 | <xsd:element name="sources" type="tSources"/> |
sources:tExtensibleElements,以及1到多个source
source:tExtensibleElements扩展,还有一个元素的sequence
还有一个属性
1 | <xsd:element name="assign" type="tAssign"/> |
Assign,基于tActivity扩展,增加了两个属性,二选一只猴构成sequence
还增加了一个属性
1 | <xsd:element name="copy" type="tCopy"/> |
copy,基于tExtensibleElements扩展,两个元素比较好理解
还有两个属性:
1 | <xsd:element name="from" type="tFrom"/> |
然而这个from并不简单,我们先看看这个sequence里边装了什么
还有几个属性
1 | <xsd:element name="literal" type="tLiteral"/> |
literal就是一个mixed描述段落,里边可以有一个任意元素。
1 | <xsd:element name="query" type="tQuery"/> |
Query和literal相似,是一个mixed描述段落,里边可以有任意个任意元素。同时它还有属性
1 | <xsd:simpleType name="tRoles"> |
myRole和partnerRole两个值二选一
1 | <xsd:element name="to" type="tTo"/> |
这个to也不简单,我们看看这个sequence里边装了什么
还有几个属性
1 | <xsd:element name="extensionAssignOperation" type="tExtensionAssignOperation"/> |
这个东西是assign中的一个element,怪不得assign没有基于tExtensibleElements扩展,放在里边了。
1 | <xsd:element name="compensate" type="tCompensate"/> |
就是tActivity的一个元素化,可以看作是一个最原始,最纯粹的activity。
1 | <xsd:element name="compensateScope" type="tCompensateScope"/> |
在compensate之上增加了一个属性:
1 | <xsd:element name="empty" type="tEmpty"/> |
就是tActivity的一个元素化,可以看作是一个最原始,最纯粹的activity。
和compensate是一样的,在语义上和用法上不一样。
1 | <xsd:element name="exit" type="tExit"/> |
就是tActivity的一个元素化,可以看作是一个最原始,最纯粹的activity。
和compensate、empty定义是一样的,在语义上和用法上不一样。
1 | <xsd:element name="extensionActivity" type="tExtensionActivity"/> |
允许从其他命名空间增加元素当作activity装进来
1 | <xsd:element name="flow" type="tFlow"/> |
基于tActivity进行扩展,sequence中包含:
1 | <xsd:element name="links" type="tLinks"/> |
links基于tExtensibleElements进行扩展(辣个男人又回来了),包含1至多个link
link同样基于tExtensibleElements进行扩展,增加了一个属性
name:NCName,这就是link的真相了
1 | <xsd:element name="forEach" type="tForEach"/> |
看名字就知道是一个forEach循环了,element包括
这四个应该不用解释了吧,for循环要素
然后还有两个属性
1 | <xsd:element name="completionCondition" type="tCompletionCondition"/> |
这个condition由一组branches构成
1 | <xsd:element name="branches" type="tBranches"/> |
branches基于tExpression进行扩展,还有一个属性
1 | <xsd:element name="if" type="tIf"/> |
if也是一类activity,基于tAcitivity进行扩展,sequence中包括
1 | <xsd:element name="elseif" type="tElseif"/> |
elseif基于tExtensibleElements扩展,sequence中包括
Else就直接是tActivityContainer了,condition都不用。
1 | <xsd:element name="invoke" type="tInvoke"/> |
annotation说明就不讲了
基于tActivity扩展,用调用其他 Web 服务,element有6个
attribute有5个
感觉看名字就懂了,没啥好讲的
1 | <xsd:complexType name="tCorrelationsWithPattern"> |
一通定义,实际上这个tCorrelationsWithPattern就是1至多个tCorrelationWithPattern
这个tCorrelationWithPattern从tCorrelation进行扩展,增加了属性pattern
这个pattern就是request、response、request-response三选一
1 | <xsd:element name="fromParts" type="tFromParts"/> |
fromParts扩展自tExtensibleElements,由1到多个fromPart组成
fromPart同样扩展自tExtensibleElements,包含两个attribute
1 | <xsd:element name="toParts" type="tToParts"/> |
toParts扩展自tExtensibleElements,由1到多个toPart组成
toPart同样扩展自tExtensibleElements,包含两个attribute
1 | <xsd:element name="pick" type="tPick"/> |
pick扩展自tActivity
两个属性都在后边定义:
一个属性:
1 | <xsd:element name="onMessage" type="tOnMessage"/> |
扩展自tOnMsgCommon
sequence中是一个activity的group
1 | <xsd:complexType name="tOnAlarmPick"> |
扩展自tExtensibleElements
sequence中有两个group
都是出现一次
1 | <xsd:element name="receive" type="tReceive"/> |
扩展自tActivity,用于(接收请求)等待客户端通过发送消息调用业务流程
2个element
6个attribute
1 | <xsd:element name="repeatUntil" type="tRepeatUntil"/> |
扩展自tActivity
sequence中包含
1 | <xsd:element name="reply" type="tReply"/> |
扩展自tActivity,用于生成同步操作的响应
2个element
6个attribute
1 | <xsd:element name="rethrow" type="tRethrow"/> |
就是tActivity的一个元素化,可以看作是一个最原始,最纯粹的activity。
和compensate、empty,exit定义是一样的,就是在语义上和用法上不一样。
1 | <xsd:element name="scope" type="tScope"/> |
扩展自tActivity,用于以分层方式将复杂流程划分为多个组织部分。scope为活动提供了行为上下文。换言之,scope可以为不同的活动(或在
sequence中有:
还有两个属性
1 | <xsd:element name="compensationHandler" type="tActivityContainer"> |
实际上就是一个tActivityContainer
1 | <xsd:element name="terminationHandler" type="tActivityContainer"> |
实际上就是一个tActivityContainer
1 | <xsd:element name="sequence" type="tSequence"/> |
扩展自tActivity,但是里边还可以装很多的activity的group的序列
1 | <xsd:element name="throw" type="tThrow"/> |
扩展自tActivity,增加了两个属性
1 | <xsd:element name="validate" type="tValidate"/> |
扩展自tActivity,增加了1个属性
1 | <xsd:simpleType name="BPELVariableNames"> |
一个BPELVariableName的list,默认空格分割,最短一个
1 | <xsd:element name="wait" type="tWait"/> |
扩展自tActivity,增加了元素,从for和until中二选一
1 | <xsd:element name="while" type="tWhile"/> |
扩展自tActivity,增加了一个sequence,里边有
1 | <xsd:complexType name="tExpression" mixed="true"> |
tExpression的内容基本就是随便写
属性有一个expressionLanguage,然后还可以再增加其他属性
看起来是any,实际上要看expressionLanguage的
1 | <xsd:complexType name="tCondition"> |
tCondition就是在tExpression的基础上随便写
1 | <xsd:element name="condition" type="tBoolean-expr"/> |
condition也是在tExpression的基础上随便写
1 | <xsd:complexType name="tDuration-expr"> |
在tExpression的基础上随便写
1 | <xsd:complexType name="tDeadline-expr"> |
在tExpression的基础上随便写
1 | <xsd:simpleType name="tBoolean"> |
yes or no,二选一
1 | <xsd:element name="exit" type="tExit"/> |
就是tActivity的一个元素化,可以看作是一个最原始,最纯粹的activity。
和compensate、empty定义是一样的,在语义上和用法上不一样。
1 | <xsd:element name="extensionActivity" type="tExtensionActivity"/> |
允许从其他命名空间增加元素当作activity装进来
1 | <xsd:element name="flow" type="tFlow"/> |
基于tActivity进行扩展,sequence中包含:
1 | <xsd:element name="links" type="tLinks"/> |
links基于tExtensibleElements进行扩展(辣个男人又回来了),包含1至多个link
link同样基于tExtensibleElements进行扩展,增加了一个属性
name:NCName,这就是link的真相了
1 | <xsd:element name="forEach" type="tForEach"/> |
看名字就知道是一个forEach循环了,element包括
这四个应该不用解释了吧,for循环要素
然后还有两个属性
1 | <xsd:element name="completionCondition" type="tCompletionCondition"/> |
这个condition由一组branches构成
1 | <xsd:element name="branches" type="tBranches"/> |
branches基于tExpression进行扩展,还有一个属性
1 | <xsd:element name="if" type="tIf"/> |
if也是一类activity,基于tAcitivity进行扩展,sequence中包括
1 | <xsd:element name="elseif" type="tElseif"/> |
elseif基于tExtensibleElements扩展,sequence中包括
Else就直接是tActivityContainer了,condition都不用。
1 | <xsd:element name="invoke" type="tInvoke"/> |
annotation说明就不讲了
基于tActivity扩展,用调用其他 Web 服务,element有6个
attribute有5个
感觉看名字就懂了,没啥好讲的
1 | <xsd:complexType name="tCorrelationsWithPattern"> |
一通定义,实际上这个tCorrelationsWithPattern就是1至多个tCorrelationWithPattern
这个tCorrelationWithPattern从tCorrelation进行扩展,增加了属性pattern
这个pattern就是request、response、request-response三选一
1 | <xsd:element name="fromParts" type="tFromParts"/> |
fromParts扩展自tExtensibleElements,由1到多个fromPart组成
fromPart同样扩展自tExtensibleElements,包含两个attribute
1 | <xsd:element name="toParts" type="tToParts"/> |
toParts扩展自tExtensibleElements,由1到多个toPart组成
toPart同样扩展自tExtensibleElements,包含两个attribute
1 | <xsd:element name="pick" type="tPick"/> |
pick扩展自tActivity
两个属性都在后边定义:
一个属性:
1 | <xsd:element name="onMessage" type="tOnMessage"/> |
扩展自tOnMsgCommon
sequence中是一个activity的group
1 | <xsd:complexType name="tOnAlarmPick"> |
扩展自tExtensibleElements
sequence中有两个group
都是出现一次
1 | <xsd:element name="receive" type="tReceive"/> |
扩展自tActivity,用于(接收请求)等待客户端通过发送消息调用业务流程
2个element
6个attribute
1 | <xsd:element name="repeatUntil" type="tRepeatUntil"/> |
扩展自tActivity
sequence中包含
1 | <xsd:element name="reply" type="tReply"/> |
扩展自tActivity,用于生成同步操作的响应
2个element
6个attribute
1 | <xsd:element name="rethrow" type="tRethrow"/> |
就是tActivity的一个元素化,可以看作是一个最原始,最纯粹的activity。
和compensate、empty,exit定义是一样的,就是在语义上和用法上不一样。
1 | <xsd:element name="scope" type="tScope"/> |
扩展自tActivity,用于以分层方式将复杂流程划分为多个组织部分。scope为活动提供了行为上下文。换言之,scope可以为不同的活动(或在
sequence中有:
还有两个属性
1 | <xsd:element name="compensationHandler" type="tActivityContainer"> |
实际上就是一个tActivityContainer
1 | <xsd:element name="terminationHandler" type="tActivityContainer"> |
实际上就是一个tActivityContainer
1 | <xsd:element name="sequence" type="tSequence"/> |
扩展自tActivity,但是里边还可以装很多的activity的group的序列
1 | <xsd:element name="throw" type="tThrow"/> |
扩展自tActivity,增加了两个属性
1 | <xsd:element name="validate" type="tValidate"/> |
扩展自tActivity,增加了1个属性
1 | <xsd:simpleType name="BPELVariableNames"> |
一个BPELVariableName的list,默认空格分割,最短一个
1 | <xsd:element name="wait" type="tWait"/> |
扩展自tActivity,增加了元素,从for和until中二选一
1 | <xsd:element name="while" type="tWhile"/> |
扩展自tActivity,增加了一个sequence,里边有
1 | <xsd:complexType name="tExpression" mixed="true"> |
tExpression的内容基本就是随便写
属性有一个expressionLanguage,然后还可以再增加其他属性
看起来是any,实际上要看expressionLanguage的
1 | <xsd:complexType name="tCondition"> |
tCondition就是在tExpression的基础上随便写
1 | <xsd:element name="condition" type="tBoolean-expr"/> |
condition也是在tExpression的基础上随便写
1 | <xsd:complexType name="tDuration-expr"> |
在tExpression的基础上随便写
1 | <xsd:complexType name="tDeadline-expr"> |
在tExpression的基础上随便写
1 | <xsd:simpleType name="tBoolean"> |
yes or no,二选一
1 | <xsd:element name="eventHandlers" type="tEventHandlers"/> |
eventHandlers基于tExtensibleElements扩展,由2种元素的sequence组成:
1 | <xsd:element name="onEvent" type="tOnEvent"/> |
onEvent元素基于tOnMsgCommon进行扩展,包含一个element sequence:
2个attribute:
1 | <xsd:complexType name="tOnMsgCommon"> |
tOnMsgCommon这个complexType同样支持tExtensibleElements扩展,包含由两类element组成的sequence:
同时还引入了5种属性:
1 | <xsd:complexType name="tCorrelations"> |
tCorrelations基于tExtensibleElements扩展,由1至多个correlation的sequence组成。
tCorrelation同样基于tExtensibleElements扩展,在此之上还定义了两个属性:
1 | <xsd:complexType name="tOnAlarmEvent"> |
tOnAlarmEvent基于tExtensibleElements扩展,由1个group:forOrUntilGroup 和 0或1个element:repeatEvery组成的sequence,或者1个element:repeatEvery,再加上一个scope组成的sequence组成。
三个元素都通过ref引用,可以继续往后看定义。
1 | <xsd:group name="forOrUntilGroup"> |
可以看到,forOrUntilGroup还真就是for或者until两个元素中选一个。这两个东西又分别通过tDuration-expr,tDeadline-expr来定义。
刚好element:repeatEvery也在这后边,一起讲了吧,同样通过tDuration-expr来定义。
1 | <xsd:complexType name="tActivity"> |
一看是activity的type,感觉应该出现过,其实并没有,大概是后边会用到吧。
同样基于tExtensibleElements扩展(啥都要tExtensibleElements扩展一下,这兼容性也太强了吧),包含两个元素组成的sequence
另外还有俩属性:
1 | <xsd:element name="targets" type="tTargets"/> |
targets基于tExtensibleElements进行扩展,包含两个元素组成的sequence:
1 | <xsd:element name="joinCondition" type="tCondition"/> |
这玩意儿的定义在tCondition里边,其实装的就是几乎啥都可以写的混合内容。
1 | <xsd:element name="target" type="tTarget"/> |
tTarget这个东西是一个机遇tExtensibleElements扩展的元素,就增加了一个元素
1 | <xsd:element name="sources" type="tSources"/> |
sources:tExtensibleElements,以及1到多个source
source:tExtensibleElements扩展,还有一个元素的sequence
还有一个属性
1 | <xsd:element name="assign" type="tAssign"/> |
Assign,基于tActivity扩展,增加了两个属性,二选一只猴构成sequence
还增加了一个属性
1 | <xsd:element name="copy" type="tCopy"/> |
copy,基于tExtensibleElements扩展,两个元素比较好理解
还有两个属性:
1 | <xsd:element name="from" type="tFrom"/> |
然而这个from并不简单,我们先看看这个sequence里边装了什么
还有几个属性
1 | <xsd:element name="literal" type="tLiteral"/> |
literal就是一个mixed描述段落,里边可以有一个任意元素。
1 | <xsd:element name="query" type="tQuery"/> |
Query和literal相似,是一个mixed描述段落,里边可以有任意个任意元素。同时它还有属性
1 | <xsd:simpleType name="tRoles"> |
myRole和partnerRole两个值二选一
1 | <xsd:element name="to" type="tTo"/> |
这个to也不简单,我们看看这个sequence里边装了什么
还有几个属性
1 | <xsd:element name="extensionAssignOperation" type="tExtensionAssignOperation"/> |
这个东西是assign中的一个element,怪不得assign没有基于tExtensibleElements扩展,放在里边了。
1 | <xsd:element name="compensate" type="tCompensate"/> |
就是tActivity的一个元素化,可以看作是一个最原始,最纯粹的activity。
1 | <xsd:element name="compensateScope" type="tCompensateScope"/> |
在compensate之上增加了一个属性:
1 | <xsd:element name="empty" type="tEmpty"/> |
就是tActivity的一个元素化,可以看作是一个最原始,最纯粹的activity。
和compensate是一样的,在语义上和用法上不一样。
本系列文章将一行一行的解读wsbpel2.0的源码。
相关xsd语法问题,请参见XSD学习笔记完整版
wsbpel2.0 xsd源码来自:ws-bpel_executable.xsd
1 | <xsd:schema xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable" |
声明命名空间http://docs.oasis-open.org/wsbpel/2.0/process/executable,没有前缀。
引入http://www.w3.org/2001/XMLSchema的语素并以xsd为前缀。
elementFormDefault="qualified"表示所有元素都必须加上前缀以表明其命名空间。
blockDefault="#all"表示默认情况下不能通过派生类代替原类型。
1 | <xsd:annotation> |
赠送了一个简单的文档说明。
1 | <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> |
引入http://www.w3.org/2001/xml.xsd的xml语素,前缀默认为xml。
1 | <xsd:element name="process" type="tProcess"> |
BPEL的根元素,此处没有定义任何内容,内部元素属性通过type=”tProcess”引入。
1 | <xsd:complexType name="tProcess"> |
首先是一个名为tExtensibleElements的扩展,先放一下往后看。
一个sequence,包括extensions,import,partnerLinks,messageExchanges,variables,correlationSets,faultHandlers,eventHandlers,还有一个activity的group,这里全部是ref,我们知道大概有些啥就行了,后边肯定会有详细的定义,先往后看吧。
接着是一堆attribute,包括process的
1 | <xsd:complexType name="tExtensibleElements"> |
tExtensibleElements这个扩展马上就来了,可以看到,扩展除了0至多个documentation(后边再讲),还有
1 | <xsd:element name="documentation" type="tDocumentation"/> |
documentation中:
1 | <xsd:group name="activity"> |
定义了一个activity的group,用于在其他地方引用,比如说通过tProcess引用到process里边。
一个activity可以是以下元素中的一个,没写到的看后边源码解读好了:
| 基本活动名称 | 释义 |
|---|---|
| assign | 活动的作用是用新的数据来更新变量的值。Assign活动可以包括任意数量的基本复制操作。 |
| compensate | 通过该活动做一些补偿动作,通常需要和scope联合使用。只能从故障处理程序或另一个补偿处理活动中调用这个活动。补偿处理程序只能被调用一次。 |
| compensateScope | |
| empty | 无所事事,比如在一个错误发生后可以不做反应来消除这个错误 |
| exit | 该活动用于立刻终止业务流程实例。所有当前运行的活动必须被立刻终止。不用引用任何终点处理、错误处理或者补偿行为。 |
| forEach | |
| invoke | 活动允许业务流程同步或异步调用由合作伙伴提供的服务,服务实现可以是单向或请求-响应操作。Invoke活动使用“partnerLink”来引用伙伴服务。同过“portType”和“operation”指定相应的WSDL接口和操作。 |
| pick | 活动会等待一组相互排斥事件中的一个事件的发生,然后执行与发生的事件相关联的活动。它会阻塞业务流程执行,以等待某一特定的事件发生,比如接收到一个合适的消息或超时警报响起。当其中任何一个事件被触发后,业务流程就会继续执行,pick也随即完成了,不会再等待其他事件的发生。 |
| receive | 活动从流程的外部伙伴那获取数据,并将其保存到流程变量。通常一个Receive是一个流程的初始点,它会阻塞执行直到匹配的消息的到达。 |
| reply | 活动发送消息给伙伴来应答通过receive活动所接收到的消息。receive和reply的组合对应着WSDL portType上定义的一个请求-响应操作。如果receive活动对应着一个单向(one-way)操作,则不能在流程中定义对应的reply活动。 |
| rethrow | |
| throw | 提示一个错误,一个故障处理可以处理这样的错误。假如一个错误不被处理的话它最终到达最高层后导致过程的终止 |
| validate | |
| wait | 活动会暂停流程执行,等待一段给定的时间或等到某一时刻才继续运行。在WebSphere Process Server 6.0中,开发者可以非常灵活地指定wait中的到期条件,比如等待多少秒,等到特定的一个日期,或是使用内置的日期表现法。也可以使用Java代码来动态指定等待时间。 |
| 结构化活动名称 | 释义 |
|---|---|
| extensionActivity | |
| flow | 可以描述更为复杂的活动执行顺序。我们可以利用flow指定一个或多个并行执行的活动。为了定义任意的控制结构,可以在并行的活动中使用链接。 |
| if | |
| repeatUntil | |
| scope | 使用这个结构可以将一组活动组织在一起作为一个处理单位。通过这个组织方法多个活动可以使用同一个故障处理、事故处理和补偿处理。通过补偿处理BPEL可以处理长时间的处理。 |
| sequence | 定义一组按顺序先后执行的活动。执行顺序是sequence活动中嵌套活动的先后顺序。当sequence中的最后一个活动完成后,该sequence活动也就完成了。 |
| while | 继承于传统的结构化编程思想,提供了while-do循环结构的支持。它可以包含一个或多个活动。它指定反复执行其内部活动,直到成功条件不被满足为止。在WPS中允许其使用Java代码来描述条件表达式。 |
1 | <xsd:element name="extensions" type="tExtensions"/> |
一个extensions由1到多个extension组成。
extension扩展自tExtensibleElements,增加了namespace和mustUnderstand两个属性。
1 | <xsd:element name="import" type="tImport"/> |
BPEL允许import,import元素在tExtensibleElements的基础上,增加namespace、location、importType三个属性,和xsd的import类似。
1 | <xsd:element name="partnerLinks" type="tPartnerLinks"/> |
和extensions相似,partnerLinks由1到多个partnerLink组成,同时支持tExtensibleElements扩展。
partnerLink在tExtensibleElements的基础上,增加了以下5个属性
1 | <xsd:element name="messageExchanges" type="tMessageExchanges"/> |
和extensions相似,messageExchanges由1到多个messageExchange组成,同时支持tExtensibleElements扩展。
messageExchange在tExtensibleElements的基础上,增加了一个属性
1 | <xsd:element name="variables" type="tVariables"/> |
和extensions相似,variables由1到多个variable组成,同时支持tExtensibleElements扩展。
variable在tExtensibleElements的基础上,增加了一个元素
增加了四个属性
1 | <xsd:simpleType name="BPELVariableName"> |
bpel变量的一个限制,BPELVariableName需要满足xsd:NCName限制,不能以.开头,且长度大于等于一个字符。
1 | <xsd:element name="correlationSets" type="tCorrelationSets"/> |
和extensions相似,correlationSets由1到多个correlationSet组成,同时支持tExtensibleElements扩展。
correlationSet在tExtensibleElements的基础上,增加了2个属性
1 | <xsd:simpleType name="QNames"> |
QNames就是一个QName的list,最少1个,默认空格分割。
1 | <xsd:element name="faultHandlers" type="tFaultHandlers"/> |
faultHandlers,听名字就知道是干啥的了,同样支持tExtensibleElements扩展,由2种元素的sequence组成:
1 | <xsd:element name="catch" type="tCatch"> |
catch扩展自tActivityContainer,包含4个属性,对catch做了限定:
1 | <xsd:element name="catchAll" type="tActivityContainer"> |
不同于catch,catchAll没有那么多属性(我全都要),就是tActivityContainer本尊,扩展自tExtensibleElements,同时包含一个activity的sequence。
OWL(Web Ontology Language)是W3C开发的一种网络本体语言,用于对本体进行语义描述。OWL是针对各方面的需求在DAML+OIL的基础上进行改进而开发的,它一方面保持了对DAML+oIL/RDFs的兼容性,另一方面又保证了更加强大的语义表达能力,同时还要保证描述逻辑(DL,Description Logic)的可判定推理。W3C的设计人员针对各类特征的需求制定了三种相应的OWL的子语言,即OWL Lite、OWL DL和OWL Full,三种子语言的表达能力递增。
个体代表领域中我们感兴趣的对象,OWL不使用唯一命名假设,即两个不同的名称可以对应一个个体(例如:“伊丽莎白女王”和“伊丽莎白温莎”是指同一个人)。在OWL中,必须明确表示个体之间是否相同,否则它们的关系是不明确的。
个体(individual)有时也被称作实例(Instance)。
属性是个体之间的二元关系。在描述逻辑中,它们就是角色(Role)的概念。
按照属性的表意及性质可以分为以下四类属性:
按照属性的链接对象不同可以分为以下三类:
表示一些个体的集合,它使用数学的方法描述出该类中成员必须具有的条件。概念(concept)这个词有时被用来代替类,实际上,类是概念的一个具体表现。
在使用一组术语之前,需要精确地指出哪些具体的词汇表将会用到。一个典型的OWL本体以命名空间声明开始,这些命名空间写到rdf:RDF\标签中。
属性值是不具有命名空间的,在OWL里可以写出它们的完整URI。完整的URI中可以利用实体定义来简略。
如:
1 | <!DOCTYPE rdf:RDF [ |
在声明这些实体后,我们可以将“&vin;merlot”作为http://www.w3.org/TR/2004/REC -owl-guide-20040210/wine#merlot的简写。
在owl:Ontology标签中给出本体的声明。这些标签支持一些重要的常务工作比如注释、版本控制以及其他本体的嵌入等。
owl:Ontology元素是用来收集关于当前文档的OWL元数据的。
rdf:about属性为本体提供一个名称或引用。
rdfs:comment提供了显然必须的为本体添加注解的能力。
owl:priorVersion是一个为用于本体的版本控制系统提供相关信息(hook)的标准标签。本体的版本控制将在后面作进一步讨论。
owl:imports提供了一种嵌入机制。owl:imports接受一个用rdf:resource属性标识的参数。
不同的个体成员可能表示同一个体,owl:sameAs表达等价的能力。
外延:我们称由属于某个类的个体所构成的集合为该类的外延(extension)。
本体:为了进行相关个体的推理。
一个领域中最基本的概念对应各个分类层次树的根。
。。。。国际化资源标识符(IRI)。。。。。统一资源标识符(URI)。。。。
rdf:ID=”Region” 被用于引入一个名称(作为定义的一部分)
在这一文档中,我们现在可以用#Region来引用Region类,例如 rdf:resource=”#Region”
rdfs:subClassOf是用于类的基本分类构造符,次关系是可传递的
一个类的定义由两部分组成:引入或引用一个名称,以及一个限制表。
1 | <owl:Thing rdf:ID="CentralCoastRegion" /> |
或者使用<Region rdf:ID="CentralCoastRegion" /> 语句来表示个体
Web本体被设计成为分布式的,我们可以通过导入和补充已有的本体来创建衍生的本体。
一个类仅是一个名称和一些描述某集合内个体的属性;而个体是该集合的成员。因此,类应自然地对应于与某论域中的事物的出现集合,而个体应对应于可被归入这些类的实际的实体。
子类:类的子集合
实例:表示一个单一的个体
一个本体的开发应坚定地由它的预定用途所驱动。这些问题也存在于OWL Full和OWL DL之间的一个重要区别。OWL Full允许将类(class)用作实例(instance),而OWL DL不允许。
一个属性是一个二元关系,有两种类型的属性:
数据类型属性(datatype properties):类实例与RDF文字或XML Schema数据类型间的关系。
对象属性(object properties):两个类的实例间的关系。
1 | <owl:ObjectProperty rdf:ID="madeFromGrape"> |
在OWL中,一个值域可被用来推断一个类型
1 | <owl:Thing rdf:ID="LindemansBin65Chardonnay"> |
可以推断出,LindemansBin65Chardonnay为一种葡萄酒,因为其定义域为wine
可以定义子属性,属性是传递的,例如X为Y的子属性,如果具有属性X,则必然同时具有属性Y。
数据类型属性:将个体关联到数据(值域为:RDF文字或XML Schema数据类型)
1 | <owl:Class rdf:ID="VintageYear" /> |
yearValue属性将VintageYears与一个整数值相关联。
1 | <Region rdf:ID="SantaCruzMountainsRegion"> |
InverseFunctional意味着属性的值域中的元素为定义域中的每个元素提供了一个唯一的标识。
它们都是是局部的(local),仅仅在包含它们的类的定义中起作用。
owl:allValuesFrom属性限制要求:对于每一个有指定属性实例的类实例,该属性的值必须是由owl:allValuesFrom从句指定的类的成员。
owl:someValuesFrom限制与之相似。
例子:Wine的制造商必须是Winery。allValuesFrom限制仅仅应用在Wine的hasMaker 属性上。Cheese的制造商并不受这一局部限制的约束。(代码如下)

| 关系 | 含意 |
|---|---|
| allValuesFrom | 对于所有的葡萄酒,如果它们有制造商,那么所有的制造商都是酿酒厂 |
| someValuesFrom | 对于所有的葡萄酒,它们中至少有一个的制造商是酿酒厂 |
owl:cardinality:这一约束允许对一个关系中的元素数目作出精确的限制。
例如,我们可以将Vintage标识为恰好含有一个VintageYear的类。

值域限制在0和1的基数表达式(Cardinality expressions)是OWL Lite的一部分。这使得用户能够表示“至少一个”,“不超过一个”,和“恰好一个”这几种意思。OWL DL中还允许使用除0与1以外的正整数值。owl:maxCardinality能够用来指定一个上界。owl:minCardinality能够用来指定一个下界。使用二者的组合就能够将一个属性的基数限制为一个数值区间。
hasValue 使得我们能够根据“特定的”属性值的存在来标识类。因此,一个个体只要至少有“一个”属性值等于hasValue的资源,这一个体就是该类的成员。

如果是Burgundy酒,那就都是干(dry)的酒。也即,它们的hasSugar属性必须至少有一个是值等于Dry(干的)。
【我的理解是,每个Burgundy都要有一个干的(Dry)属性,以此来标识该酒是干酒】
用于实现本体的共享。
属性owl:equivalentClass被用来表示两个类有着完全相同的实例。但我们要注意,在OWL DL中,类仅仅代表着个体的集合而不是个体本身。然而在OWL FULL中,我们能够使用owl:sameAs来表示两个类在各方面均完全一致。
类似的,我们可以通过使用owl:equivalentProperty属性声明表达属性的等同。
SameAs:描述个体之间相同的机制与描述类之间的相同机制类似,仅仅只要两个个体的声明形成一致的就可以了。
假如hasMaker是一个函数型属性,那么下面的例子就不一定会产生冲突。
1 | <owl:Thing rdf:about="#BancroftChardonnay"> |
除非和我们本体中的其他信息发生冲突,不然的话这样的描述是没有冲突的,他说明Bancroft和Beringer是相同的个体。
要清楚,修饰(或引用)两个类用sameAs还是用equivalentClass效果是不同的。用sameAs的时候,把一个类解释为一个个体,就像在OWL Full中一样,这有利于对本体进行分类。在OWL Full中,sameAs可以用来引用两个东西,如一个类和一个个体、一个类和一个属性等等,无论什么情况,都将被解释为个体。
这一机制提供了与sameAs相反的效果。

说明了三个值互不相同。如果我们没有用 differentFrom元素来申明既干又甜的葡萄酒,这意味着“干葡萄酒”和“甜葡萄酒”是相同的。但是我们从上面申明的元素来推断,这又是矛盾的。还有一种更便利的定义相互不同个体的机制,如下

要注意,owl:distinctMembers属性声明只能和owl:AllDifferent属性声明一起结合使用。
用于创建类的表达式。OWL支持基本的集合操作,即并,交和补运算。它们分别被命名为owl:unionOf,owl:intersectionOf,和owl:complementOf.此外,类还可以是枚举的。类的外延可以使用oneOf构造子来显示的声明。同时,我们也可以声明类的外延必须是互不相交的。
注意:OWL类外延是由个体组成的集合,二这些个体都是类的成员。
1 | <owl:Class rdf:ID="WhiteWine"> |
这个例子表示,白葡萄酒就是葡萄酒和白色物体的相交的集合。如果不这么表示,计算机只知道,白葡萄酒有白色的属性;却不知道,所有白色的葡萄酒是白葡萄酒

WhiteBurgundy类恰好是白葡萄酒和Burgundies的交集。依次,Burgundies生产在法国一个叫做Bourgogne的地方并且它是干葡萄酒(dry wine)。因此,所有满足这些标准的葡萄酒个体都是WhiteBurgundy类的外延的一部分。
表示两个集合的∪。使用方法同上,将intersectionOf改成unionOf。
就是表示差集,complementOf典型的用法是与其它集合运算符联合使用,如下

上面的例子定义了一个NonFrenchWine类,它是Wine类与所有不位于法国的事物的集合的交集。
以直接枚举的方式描述类的成员。特别的,这个定义完整的描述了类的外延(类的范围?),因此任何其他个体都不能声明为属于这个类。如下:

这段代码说明,WineColor只包含三种,white rose和red,任何其他的颜色都不是winecolor类的实例
oneOf结构的每一个元素都必须是一个有效声明的个体。一个个体必须属于某个类。在上面的例子中,每一个个体都是通过名字来引用的。我们使用owl:Thing简单地进行引用,尽管这有点多余(因为每个个体都属于owl:Thing)。另外,我们也可以根据具体类型WineColor来引用集合中的元素:

另外,较复杂的个体描述同样也可以是oneOf结构的有效元素,例如:

使用owl:disjointWith构造子可以表达一组类是不相交的。它保证了属于某一个类的个体不能同时又是另一个指定类的实例。

Pasta例子声明了多个不相交类。注意它只声明了Pasta与其它所有类是不相交的。例如,它并没有保证Meat和Fruit是不相交的。为了声明一组类是互不相交的,我们必须对每两个类都使用owl:disjointWith来声明。
在下面的例子中,我们定义了Fruit是SweetFruit和NonSweetFruit的并集。而且我们知道这些子类恰好将Fruit划分成了连个截然不同的子类,因为它们是互不相交的。随着互不相交的类的增加,不相交的声明的数目也会相应的增加到n的2次方。然而,在我们已知的用例中,n通常比较小。

本体和软件一样需要维护,因此它们将随着时间的推移而改变。在一个owl:Ontology元素(如上面讨论的http://www.w3.org/TR/2004/REC-owl-guide-20040210/#OntologyHeaders) 内,链接到一个以前定义的本体版本是可能的。属性owl:priorVersion被用来提供这种链接,并能用它跟踪一个本体的版本历史。
本体版本可能彼此互不兼容,例如,一个本体以前的版本可能包含与现在版本中的陈述相矛盾的陈述。在一个owl:Ontology元素中,我们使用owl:backwardCompatibleWith和owl:incompatibleWith这些属性来指出本体版本是兼容还是不兼容以前的版本。如果没有进行owl:backwardCompatibleWith声明,那么我们假定就不存在兼容性。除了上面讲到的两个属性,还有一个属性owl:versionInfo适用与版本控制系统,它提供了一些相关信息(hook)。和前面三个属性相反的是,owl:versionInfo的客体是一个文字值(literal),这一属性除了可以用来注释本体之外还可以用来注释类和属性。
注:本文摘自W3school Schema 教程
属性大全
| 属性 | 说明 | 取值 |
|---|---|---|
| id | 标识该元素的唯一ID | |
| attributeFormDefault | 指定XML文档使用schema中定义的局部属性时是否必须使用命名空间限定 | qualified:必须通过命名空间前缀限定、unqualified:(默认值)无须通过命名空间前缀限定 |
| elementFormDefault | 指定XML文档使用schema中定义的局部元素时是否必须使用命名空间限定 | 取值和含义同attributeFormDefault |
| blockDefault | 设定schema中element和complexType上的block属性的默认值、block属性用来阻止以指定的派生类型代替原类型 | #all或者extension、restriction和substitution的自由组合、例如extension表示防止通过扩展派生的复杂类型替代该复杂类型 |
| finalDefault | 设定schema中element、simpleType和complexType上的final的默认值、final属性用来阻止以指定的派生类型来派生新类型 | 对于element和complexType:值可以是#all或extension和restriction的自由组合、对于simpleType:值可以是#all或restriction、list和union的自由组合 |
| targetNamespace | 设定schema的命名空间的URI引用 | |
| version | 设定schema的版本 | |
| xmlns | 设定schema使用的一个或多个命名空间的URI引用 | |
| any attributes | 设定带有non-schema命名空间的任何其他属性 |
<schema> 元素是每一个 XML Schema 的根元素:
<?xml version=”1.0”?>
1 | <xs:schema> |
<schema> 元素可包含属性。一个 schema 声明往往看上去类似这样:
1 | <?xml version="1.0"?> |
1 | xmlns:xs="http://www.w3.org/2001/XMLSchema" |
显示 schema 中用到的元素和数据类型来自命名空间 http://www.w3.org/2001/XMLSchema。
同时它还规定了来自命名空间 http://www.w3.org/2001/XMLSchema的元素和数据类型应该使用前缀 xs。
1 | targetNamespace="http://www.w3school.com.cn" |
显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: http://www.w3school.com.cn。
1 | xmlns="http://www.w3school.com.cn" |
指出默认的命名空间是 http://www.w3school.com.cn。
1 | elementFormDefault="qualified" |
指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。
引用方式有两种:
import与include的作用是一样的。 区别在于import是导入另外一个命名空间的xsd, 而inlude是包含同一个命名空间的xsd。
1 | <xsd:include schemaLocation="module/owl1-lite-core.xsd" /> |
1 | <xsd:import namespace="http://www.w3.org/XML/1998/namespace" |
此 XML 文档含有对 XML Schema 的引用:
1 | <?xml version="1.0"?> |
1 | xmlns="http://www.w3school.com.cn" |
规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 http://www.w3school.com.cn 这个命名空间。
一旦您拥有了可用的 XML Schema 实例命名空间:
1 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
您就可以使用 schemaLocation 属性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置:
1 | xsi:schemaLocation="http://www.w3school.com.cn note.xsd" |
1 | <xs:element name="xxx" type="yyy"/> |
缺省值(默认值)设置:
1 | <xs:element name="color" type="xs:string" default="red"/> |
固定值设置:
1 | <xs:element name="color" type="xs:string" fixed="red"/> |
这是一些 XML 元素:
1 | <lastname>Smith</lastname> |
这是相应的简易元素定义:
1 | <xs:element name="lastname" type="xs:string"/> |
1 | <list |
| 属性 | 描述 |
|---|---|
| id | 可选。规定该元素的唯一的 ID。 |
| itemType | 在该 schema(或由指定的命名空间指示的其他 schema)中定义的内置数据类型或 simpleType 元素的名称。包含 list 元素的 simpleType 元素是从 list 值指定的简单类型派生的。list 值必须是限定名 (QName)。 如果内容包含 simpleType 元素,则不允许使用该属性,否则该属性是必需的。 |
| any attributes | 可选。规定带有 non-schema 命名空间的任何其他属性。 |
下面的例子展示了为一列整数的简单类型:
1 | <?xml version="1.0"?> |
文档中的 “intvalues” 元素类似这样(注意这个列表有五个列表项):
1 | <intvalues>100 34 56 -23 1567</intvalues> |
注释:空格被作为列表项的分隔符
1 | <xs:attribute name="xxx" type="yyy"/> |
这是带有属性的 XML 元素:
1 | <lastname lang="EN">Smith</lastname> |
这是对应的属性定义:
1 | <xs:attribute name="lang" type="xs:string"/> |
缺省值(默认值)设置:
1 | <xs:attribute name="lang" type="xs:string" default="EN"/> |
固定值设置:
1 | <xs:attribute name="lang" type="xs:string" fixed="EN"/> |
在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 “use” 属性:
1 | <xs:attribute name="lang" type="xs:string" use="required"/> |
下面的例子定义了带有一个限定且名为 “age” 的元素。age 的值不能低于 0 或者高于 120:
1 | <xs:element name="age"> |
如需把 XML 元素的内容限制为一组可接受的值,我们要使用枚举约束(enumeration constraint)。
下面的例子定义了带有一个限定的名为 “car” 的元素。可接受的值只有:Audi, Golf, BMW:
1 | <xs:element name="car"> |
上面的例子也可以被写为:
1 | <xs:element name="car" type="carType"/> |
注释:在这种情况下,类型 “carType” 可被其他元素使用,因为它不是 “car” 元素的组成部分。
如需把 XML 元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束(pattern constraint)。
下一个例子也定义了带有一个限定的名为 “initials” 的元素。可接受的值是大写或小写字母 a - z 其中的三个:
1 | <xs:element name="initials"> |
下一个例子定义了带有一个限定的名为 “choice 的元素。可接受的值是字母 x, y 或 z 中的一个:
1 | <xs:element name="choice"> |
下面的例子定义了带有一个限定的名为 “letter” 的元素。可接受的值是 a - z 中零个或多个字母:
1 | <xs:element name="letter"> |
下面的例子定义了带有一个限定的名为 “letter” 的元素。可接受的值是一对或多对字母,每对字母由一个小写字母后跟一个大写字母组成。举个例子,”sToP”将会通过这种模式的验证,但是 “Stop”、”STOP” 或者 “stop” 无法通过验证:
1 | <xs:element name="letter"> |
下面的例子定义了带有一个限定的名为 “gender” 的元素。可接受的值是 male 或者 female:
1 | <xs:element name="gender"> |
下面的例子定义了带有一个限定的名为 “password” 的元素。可接受的值是由 8 个字符组成的一行字符,这些字符必须是大写或小写字母 a - z 亦或数字 0 - 9:
1 | <xs:element name="password"> |
如需规定对空白字符(whitespace characters)的处理方式,我们需要使用 whiteSpace 限定。
下面的例子定义了带有一个限定的名为 “address” 的元素。这个 whiteSpace 限定被设置为 “preserve”,这意味着 XML 处理器不会移除任何空白字符:
1 | <xs:element name="address"> |
这个例子也定义了带有一个限定的名为 “address” 的元素。这个 whiteSpace 限定被设置为 “replace”,这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符):
1 | <xs:element name="address"> |
这个例子也定义了带有一个限定的名为 “address” 的元素。这个 whiteSpace 限定被设置为 “collapse”,这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格):
1 | <xs:element name="address"> |
如需限制元素中值的长度,我们需要使用 length、maxLength 以及 minLength 限定。
本例定义了带有一个限定且名为 “password” 的元素。其值必须精确到 8 个字符:
1 | <xs:element name="password"> |
这个例子也定义了带有一个限定的名为 “password” 的元素。其值最小为 5 个字符,最大为 8 个字符:
1 | <xs:element name="password"> |
| 限定 | 描述 |
|---|---|
| enumeration | 定义可接受值的一个列表 |
| fractionDigits | 定义所允许的最大的小数位数。必须大于等于0。 |
| length | 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。 |
| maxExclusive | 定义数值的上限。所允许的值必须小于此值。 |
| maxInclusive | 定义数值的上限。所允许的值必须小于或等于此值。 |
| maxLength | 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。 |
| minExclusive | 定义数值的下限。所允许的值必需大于此值。 |
| minInclusive | 定义数值的下限。所允许的值必需大于或等于此值。 |
| minLength | 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。 |
| pattern | 定义可接受的字符的精确序列。 |
| totalDigits | 定义所允许的阿拉伯数字的精确位数。必须大于0。 |
| whiteSpace | 定义空白字符(换行、回车、空格以及制表符)的处理方式。 |
四种类型的复合元素:
注释:上述元素均可包含属性!
1 | <employee> |
的XML Schema可以写成:
1 | <xs:element name="employee"> |
或者:
1 | <xs:element name="employee" type="personinfo"/> |
也可以在已有的复合元素之上以某个复合元素为基础,然后添加一些元素,就像这样:
1 | <xs:element name="employee" type="fullpersoninfo"/> |
一个空的 XML 元素:
1 | <product prodid="1345" /> |
上面的 “product” 元素根本没有内容。为了定义无内容的类型,我们就必须声明一个在其内容中只能包含元素的类型,但是实际上我们并不会声明任何元素,比如这样:
1 | <xs:element name="product"> |
或者:
1 | <xs:element name="product"> |
or:
1 | <xs:element name="product" type="prodtype"/> |
XML 元素,”person”,仅包含其他的元素:
1 | <person> |
可在 schema 中这样定义 “person” 元素:
1 | <xs:element name="person"> |
或者:
1 | <xs:element name="person" type="persontype"/> |
此类型仅包含简易的内容(文本和属性),因此我们要向此内容添加 simpleContent 元素。当使用简易内容时,我们就必须在 simpleContent 元素内定义扩展或限定,就像这样:
1 | <xs:element name="某个名称"> |
或者:
1 | <xs:element name="某个名称"> |
1 | <shoesize country="france">35</shoesize> |
下面这个例子声明了一个复合类型,其内容被定义为整数值,并且 “shoesize” 元素含有名为 “country” 的属性:
1 | <xs:element name="shoesize"> |
我们也可为 complexType 元素设定一个名称,并让 “shoesize” 元素的 type 属性来引用此名称(通过使用此方法,若干元素均可引用相同的复合类型):
1 | <xs:element name="shoesize" type="shoetype"/> |
带有混合内容的复合类型
XML 元素,”letter”,含有文本以及其他元素:
1 | <letter> |
下面这个 schema 声明了这个 “letter” 元素:
1 | <xs:element name="letter"> |
注释:为了使字符数据可以出现在 “letter” 的子元素之间,mixed 属性必须被设置为 “true”。xs:sequence\ 标签 (name、orderid 以及 shipdate ) 意味着被定义的元素必须依次出现在 “letter” 元素内部。
或者:
1 | <xs:element name="letter" type="lettertype"/> |
七种指示器:
Order 指示器:
Occurrence 指示器:
Group 指示器:
<all> 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次.
当使用 <all> 指示器时,你可以把 <minOccurs> 设置为 0 或者 1,而只能把 <maxOccurs> 指示器设置为 1
1 | <xs:element name="person"> |
<choice> 指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼),如需设置子元素出现任意次数,可将 <maxOccurs> 设置为 unbounded(无限次):
1 | <xs:element name="person"> |
<sequence> 规定子元素必须按照特定的顺序出现:
1 | <xs:element name="person"> |
Occurrence 指示器用于定义某个元素出现的频率。对于所有的 “Order” 和 “Group” 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默认值均为 1。
<maxOccurs>指示器可规定某个元素可出现的最大次数,如需使某个元素的出现次数不受限制,可以使用 maxOccurs=”unbounded” 这个声明:
1 | <xs:element name="person"> |
<minOccurs>指示器可规定某个元素能够出现的最小次数:
1 | <xs:element name="person"> |
元素组通过 group 声明进行定义:
1 | <xs:group name="组名称"> |
您必须在 group 声明内部定义一个 all、choice 或者 sequence 元素。下面这个例子定义了名为 “persongroup” 的 group,它定义了必须按照精确的顺序出现的一组元素:
1 | <xs:group name="persongroup"> |
在您把 group 定义完毕以后,就可以在另一个定义中引用它了:
1 | <xs:group name="persongroup"> |
属性组通过 attributeGroup 声明来进行定义:
1 | <xs:attributeGroup name="组名称"> |
下面这个例子定义了名为 “personattrgroup” 的一个属性组:
1 | <xs:attributeGroup name="personattrgroup"> |
在您已定义完毕属性组之后,就可以在另一个定义中引用它了,就像这样:
1 | <xs:attributeGroup name="personattrgroup"> |
<any> 元素使我们有能力通过未被 schema 规定的元素来拓展 XML 文档!
下面这个例子是从名为 “family.xsd” 的 XML schema 中引用的片段。它展示了一个针对 “person” 元素的声明。通过使用 <any> 元素,我们可以通过任何元素(在 <lastname> 之后)扩展 “person” 的内容:
1 | <xs:element name="person"> |
<anyAttribute> 元素使我们有能力通过未被 schema 规定的属性来扩展 XML 文档!
下面的例子是来自名为 “family.xsd” 的 XML schema 的一个片段。它为我们展示了针对 “person” 元素的一个声明。通过使用 <anyAttribute> 元素,我们就可以向 “person” 元素添加任意数量的属性:
1 | <xs:element name="person"> |
让我们举例说明:我们的用户来自英国和挪威。我们希望有能力让用户选择在 XML 文档中使用挪威语的元素名称还是英语的元素名称。
为了解决这个问题,我们可以在 XML schema 中定义一个 substitutionGroup。首先,我们声明主元素,然后我们会声明次元素,这些次元素可声明它们能够替换主元素。
1 | <xs:element name="name" type="xs:string"/> |
有效的 XML 文档类似这样(根据上面的 schema):
1 | <customer> |
或类似这样:
1 | <kunde> |
如果需要阻止元素替换,可使用 block 属性:
1 | <xs:element name="name" type="xs:string" block="substitution"/> |
请注意,substitutionGroup 中的所有元素(主元素和可替换元素)必须被声明为全局元素,否则就无法工作!
全局元素指 “schema” 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。
字符串数据类型可包含字符、换行、回车以及制表符。如果您使用字符串数据类型,XML 处理器就不会更改其中的值。
1 | <xs:element name="customer" type="xs:string"/> |
规格化字符串数据类型同样可包含字符,但是 XML 处理器会移除折行,回车以及制表符。
下面是一个关于在某个 schema 中规格化字符串数据类型的例子:
1 | <xs:element name="customer" type="xs:normalizedString"/> |
文档中的元素看上去应该类似这样:
1 | <customer>John Smith</customer> |
或者类似这样:
1 | <customer> John Smith </customer> |
注释:在上面的例子中,XML 处理器会使用空格替换所有的制表符。
Token 数据类型同样可包含字符,但是 XML 处理器会移除换行符、回车、制表符、开头和结尾的空格以及(连续的)空格。
下面是在 schema 中一个有关 token 声明的例子:
1 | <xs:element name="customer" type="xs:token"/> |
文档中的元素看上去应该类似这样:
1 | <customer>John Smith</customer> |
或者类似这样:
1 | <customer> John Smith </customer> |
注释:在上面这个例子中,XML 解析器会移除制表符。
| 名称 | 描述 |
|---|---|
| ENTITIES | |
| ENTITY | |
| ID | 在 XML 中提交 ID 属性的字符串 (仅与 schema 属性一同使用) |
| IDREF | 在 XML 中提交 IDREF 属性的字符串(仅与 schema 属性一同使用) |
| IDREFS language | 包含合法的语言 id 的字符串 |
| Name | 包含合法 XML 名称的字符串 |
| NCName | `NCName ::= (Letter |
| NMTOKEN | 在 XML 中提交 NMTOKEN 属性的字符串 (仅与 schema 属性一同使用) |
| NMTOKENS | |
| normalizedString | 不包含换行符、回车或制表符的字符串 |
| QName | QName ::= (Prefix ':')? LocalPartPrefix ::= NCNameLocalPart ::= NCName |
| string | 字符串 |
| token | 不包含换行符、回车或制表符、开头或结尾空格或者多个连续空格的字符串 |
可与字符串数据类型一同使用的限定:
日期使用此格式进行定义:”YYYY-MM-DD”
下面是一个有关 schema 中日期声明的例子:
1 | <xs:element name="start" type="xs:date"/> |
文档中的元素看上去应该类似这样:
1 | <start>2002-09-24</start> |
如需规定一个时区,您也可以通过在日期后加一个 “Z” 的方式,使用世界调整时间(UTC time)来输入一个日期 - 比如这样:
1 | <start>2002-09-24Z</start> |
或者也可以通过在日期后添加一个正的或负时间的方法,来规定以世界调整时间为准的偏移量 - 比如这样:
1 | <start>2002-09-24-06:00</start> |
或者:
1 | <start>2002-09-24+06:00</start> |
时间使用下面的格式来定义:”hh:mm:ss”
下面是一个有关 schema 中时间声明的例子:
1 | <xs:element name="start" type="xs:time"/> |
时区同上
日期时间使用下面的格式进行定义:”YYYY-MM-DDThh:mm:ss”
下面是一个有关 schema 中日期时间声明的例子:
1 | <xs:element name="startdate" type="xs:dateTime"/> |
1 | <startdate>2002-05-30T09:00:00</startdate> |
时区同上
时间间隔使用下面的格式来规定:”PnYnMnDTnHnMnS”,其中:
如需规定一个负的持续时间,请在 P 之前输入减号:
1 | <period>-P10D</period> |
| 名称 | 描述 |
|---|---|
| date | 定义一个日期值 |
| dateTime | 定义一个日期和时间值 |
| duration | 定义一个时间间隔 |
| gDay | 定义日期的一个部分 - 天 (DD) |
| gMonth | 定义日期的一个部分 - 月 (MM) |
| gMonthDay | 定义日期的一个部分 - 月和天 (MM-DD) |
| gYear | 定义日期的一个部分 - 年 (YYYY) |
| gYearMonth | 定义日期的一个部分 - 年和月 (YYYY-MM) |
| time | 定义一个时间值 |
可与日期数据类型一同使用的限定:
1 | <xs:element name="prize" type="xs:decimal"/> |
您可规定的十进制数字的最大位数是 18 位。
1 | <xs:element name="prize" type="xs:integer"/> |
| 名字 | 秒数 |
|---|---|
| byte | 有正负的 8 位整数 |
| decimal | 十进制数 |
| int | 有正负的 32 位整数 |
| integer | 整数值 |
| long | 有正负的 64 位整数 |
| negativeInteger | 仅包含负值的整数 ( .., -2, -1.) |
| nonNegativeInteger | 仅包含非负值的整数 (0, 1, 2, ..) |
| nonPositiveInteger | 仅包含非正值的整数 (.., -2, -1, 0) |
| positiveInteger | 仅包含正值的整数 (1, 2, ..) |
| short | 有正负的 16 位整数 |
| unsignedLong | 无正负的 64 位整数 |
| unsignedInt | 无正负的 32 位整数 |
| unsignedShort | 无正负的 16 位整数 |
| unsignedByte | 无正负的 8 位整数 |
可与数值数据类型一同使用的限定:
其他杂项数据类型包括逻辑、base64Binary、十六进制、浮点、双精度、anyURI、anyURI 以及 NOTATION。
逻辑数据性用于规定 true 或 false 值。
1 | <xs:attribute name="disabled" type="xs:boolean"/> |
合法的布尔值是 true、false、1(表示 true) 以及 0(表示 false)。
二进制数据类型用于表达二进制形式的数据。
我们可使用两种二进制数据类型:
下面是一个关于某个 scheme 中 hexBinary 声明的例子:
1 | <xs:element name="blobsrc" type="xs:hexBinary"/> |
anyURI 数据类型用于规定 URI。
下面是一个关于某个 scheme 中 anyURI 声明的例子:
1 | <xs:attribute name="src" type="xs:anyURI"/> |
文档中的元素看上去应该类似这样:
1 | <pic src="http://www.w3school.com.cn/images/smiley.gif" /> |
注释:假如某个 URI 含有空格,请用 %20 替换它们。
可与杂项数据类型一同使用的限定:
商业人士不仅需要更好的了解设计,他们更需要把自己变成设计师。
————Roger Martin


将模式描绘出来,这个模式就转换成一个持久的事物,也是一个可以随时返回讨论的概念原点。

原型制作可以让概念变得更加形象具体,并能促进新创意的探索。
如果过快地专注于一个创意,你就会迷上它。如果急于精雕细琢某个创意,你就会变得依附于它,很难保持不断的探索、不断寻找更好的创意。对于那些不成熟的早期模型尤其需要审慎小心。
Jin Glymph,盖里公司合伙人


技巧有很多,要充分了解谁是你的听众,你会出席什么场合,再来选择一种匹配的技巧。

两种情景推测:


建筑中的式样就是将原型和原形的再现抽象为建筑设计的概念
——Christopher Alexander
商业模式式样

核心:多样少量

多边平台将两个或者更多有明显区别但有互相依赖的客户群体集合在一起。

通过该商业模式的其他部分或其他客户细分群体,给分服务用户细分群体提供财务支持。




开放式商业模式可以用哪些通过与外部伙伴系统合作,来创造和捕捉价值的企业。



