如何在外部验证器中重用Orbeon的验证?

时间:2016-06-15 16:53:42

标签: orbeon

我们针对一组多个Orbeon表单运行单独的验证过程,以便我们可以在一个位置向用户显示一整套验证消息。我们希望将relevantrequired中的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

1 个答案:

答案 0 :(得分:0)

如果您计划从自己的Java代码运行在Orbeon Forms中运行的XPath表达式,则必须使用Orbeon Forms中使用的相同XPath处理器和相同的XPath函数库。另一种方法是重新发明轮子,这将非常困难。

Orbeon Forms有一些用于调用XPath的抽象,例如XPathCacheXPath。此时,这不是为Orbeon Forms之外的第三方代码设计的,因此可能需要一些工作。

不过,您可以尝试使用它,或者至少使用Saxon XPath处理器尽可能接近。

理想情况下,表单验证服务将作为Orbeon Forms的一部分提供,并利用现有的验证代码,但这是一项新功能(另请参阅#1357)。