我们针对一组多个Orbeon表单运行单独的验证过程,以便我们可以在一个位置向用户显示一整套验证消息。我们希望将relevant
,required
中的XPath表达式和表单定义中的验证表达式用作此过程的一部分,而不是复制这些规则。
我们是否可以通过调用Orbeon来获取表单的验证消息,包括使用控件匹配这些消息的元数据?
或者,我们尝试使用表达式并处理它们以处理我们的数据。在我们的系统中,我们使用控件的规范名称,我们使用这些控件将多个表单中的数据存储在单个XML结构中。例如,如果我们有一个包含两个表单的表单集,其中包含以下字段:
表格A
now.applicantInformation.individualOrCompany
now.applicantInformation.relationshipToCompanyOrOrganization
now.applicantInformation.areYouTheIndividualThisAuthorizationWillBeIssuedTo
now.agentInformation.agentMailingAddress.addressType
now.agentInformation.agentMailingAddress.additionalAddressInformation
表格B
now.access.presentlyGated
now.access.inspectorHasKey
我们得到的数据看起来与此类似:
<now>
<applicantInformation>
<individualOrCompany>Organization</individualOrCompany>
<relationshipToCompanyOrOrganization>Agent</relationshipToCompanyOrOrganization>
<areYouTheIndividualThisAuthorizationWillBeIssuedTo>N</areYouTheIndividualThisAuthorizationWillBeIssuedTo>
</applicantInformation>
<agentInformation>
<agentMailingAddress>
<addressType>Rural Route</addressType>
<additionalAddressInformation></additionalAddressInformation>
</agentMailingAddress>
</agentInformation>
<access>
<presentlyGated>Y</presentlyGated>
<inspectorHasKey>N</inspectorHasKey>
</access>
</now>
对于字段now.agentInformation.agentMailingAddress.additionalAddressInformation
,我们有relevant
xpath表达式:
(
(
$now.applicantInformation.applicantInformation.individualOrCompany='Organization'
and $now.applicantInformation.applicantInformation.relationshipToCompanyOrOrganization = ('Agent','Executor_Administrator_Trustee','Friend_Neighbour','Power of Attorney','Representative','Trustee in Bankruptcy')
)
or ($now.applicantInformation.applicantInformation.areYouTheIndividualThisAuthorizationWillBeIssuedTo='N')
)
and $now.applicantInformation.agentInformation.agentMailingAddress.addressType='Rural Route'
我们认为我们可以将它转换为适用于我们的数据结构的xpath表达式,如下所示:
(
(
/now/applicantInformation/applicantInformation/individualOrCompany/text() = 'Organization'
and /now/applicantInformation/applicantInformation/relationshipToCompanyOrOrganization/text() = ('Agent','Executor_Administrator_Trustee','Friend_Neighbour','Power of Attorney','Representative','Trustee in Bankruptcy')
)
or (/now/applicantInformation/applicantInformation/areYouTheIndividualThisAuthorizationWillBeIssuedTo/text() = 'N')
)
and /now/applicantInformation/agentInformation/agentMailingAddress/addressType/text() = 'Rural Route'
不幸的是,当我们从Java运行这个xpath表达式时,我们从表达式的这一部分得到一个错误:
/now/applicantInformation/applicantInformation/relationshipToCompanyOrOrganization/text() = ('Agent','Executor_Administrator_Trustee','Friend_Neighbour','Power of Attorney','Representative','Trustee in Bankruptcy')
错误是:
expected ) but found ,
标准xpath似乎不支持/element/text() = ('a','b','c')
语法。 Orbeon是否能够通过使用XQuery或XForms来支持它?
我们可以将其转换为使用OR运算符,但这样做有点难看:
/now/applicantInformation/applicantInformation/relationshipToCompanyOrOrganization[text() = 'Agent' or text() = 'Executor_Administrator_Trustee' or text() = 'Friend_Neighbour' or text() = 'Power of Attorney' or text() = 'Representative' or text() = 'Trustee in Bankruptcy' ]
我们还有使用days-from-duration
等函数的表达式。 XPath具有days-from-duration
功能,但这似乎与Orbeon使用的功能不同。示例表达式是:
days-from-duration(($nda.technicalInformation.startAndEndDate.endDate) - ($nda.technicalInformation.startAndEndDate.startDate)) > 0
答案 0 :(得分:0)
如果您计划从自己的Java代码运行在Orbeon Forms中运行的XPath表达式,则必须使用Orbeon Forms中使用的相同XPath处理器和相同的XPath函数库。另一种方法是重新发明轮子,这将非常困难。
Orbeon Forms有一些用于调用XPath的抽象,例如XPathCache
和XPath
。此时,这不是为Orbeon Forms之外的第三方代码设计的,因此可能需要一些工作。
不过,您可以尝试使用它,或者至少使用Saxon XPath处理器尽可能接近。
理想情况下,表单验证服务将作为Orbeon Forms的一部分提供,并利用现有的验证代码,但这是一项新功能(另请参阅#1357)。