2016-06-15 3 views
1

Мы выполняем отдельный процесс проверки по отношению к множеству нескольких форм Орбеона, чтобы мы могли отображать полный набор сообщений проверки для пользователя в одном месте. Мы хотим использовать выражения XPath в relevant, required и выражения проверки в определениях форм как часть этого процесса, а не дублировать эти правила.Как я могу повторно использовать проверку орбена во внешнем валидаторе?

Есть ли способ, по которому мы можем позвонить Орбену, чтобы получить сообщения о проверке для формы, включая метаданные, чтобы соответствовать этим сообщениям с элементами управления?

В качестве альтернативы мы попытались принять выражения и обработать их для работы с нашими данными. В нашей системе мы используем канонические имена для элементов управления, которые мы используем для хранения данных из нескольких форм в единой структуре 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' 

К сожалению, когда мы запускаем это выражение xpath из Java, мы получаем ошибку из этой части выражения:

/now/applicantInformation/applicantInformation/relationshipToCompanyOrOrganization/text() = ('Agent','Executor_Administrator_Trustee','Friend_Neighbour','Power of Attorney','Representative','Trustee in Bankruptcy') 

Ошибка:

expected) but found , 

кажется, что синтаксис /element/text() = ('a','b','c') не поддерживается стандартной XPath. Может ли Orbeon поддерживать это с помощью XQuery или XForms?

Мы можем преобразовать это использовать ИЛИ оператора, но это немного некрасиво, чтобы сделать это:

/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

Как вы это называете на Java? Я полагаю, вы не используете процессор Sathon XPath 2? Если XPath 1, то вы не сможете многое сделать, потому что XPath 1 является антикварным. Даже скобки, которые вы используете в своем выражении, не будут работать с XPath 1. – ebruchez

+0

Кстати, в XPath 2 вы почти * никогда не должны использовать 'text()'. Например, 'foo/text() = ('bar', 'baz')' можно заменить на 'foo = ('bar', 'baz')' или 'foo/string() = ('bar', 'Баз') '. – ebruchez

ответ

0

Если вы планируете запускать XPath выражения, которые выполняются в Orbeon форм из вашего собственного кода Java, вы должны использовать один и тот же процессор XPath, используемый в Orbeon форм, и тот же XPath библиотека функций. Альтернативой является изобретать велосипед, и это будет очень сложно.

У Orbeon Forms есть некоторые абстракции для вызова XPath, такие как XPathCache и XPath.На данный момент это не предназначено для использования сторонним кодом вне Orbeon Forms, поэтому некоторые работы могут быть необходимы там.

Тем не менее, вы можете попробовать это использовать или, по крайней мере, использовать процессор Saxon XPath для доступа как можно ближе.

Idealy, служба проверки формы будет предлагаться как часть форм Orbeon и использовать существующий код проверки, но это новая функция (см. Также #1357).

Смежные вопросы