BizTalk - Извлечение значения элемента с использованием xpath с несколькими пространствами имен - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть сотрудник msg в BizTalk. В оркестровке я пытаюсь получить значение поля (IBKT_SYSID_PK), но оно возвращается пустым. Pls assist.

EMPLOYEE Сообщение:

<ns1:Employee xmlns:ns2="http://purl.org/dc/elements/1.1/" xmlns:ns3="http://www.w3.org/XML/1998/namespace" xmlns:ns4="http://www.w3.org/2000/09/xmldsig#">
  <EmployeeHeader>
    <State>tobeProcessedbySubOrch</State>
    <GUID>4a569a18-5b6a-4b90-9c0c-324cbdcf78e8</GUID>
    <EmployeeStatus>update</EmployeeStatus>
    <Vendor>A</Vendor>
    <Destination>K</Destination>
    <Errors>
      <ErrorType>Business</ErrorType>
      <ErrorCorrection />
    <Error><FldName>EMPL-59637</FldName><Code>302</Code><Msg>Modified Date Mismatch, data might be out of sync between K and A</Msg></Error></Errors>
    <ErrorInd>true</ErrorInd>
    <WarningInd>false</WarningInd>
    <TransactionID>40047965</TransactionID>
    <LogicalKey>59637</LogicalKey>
    <ReceivedTS>2020-02-26T03:42:03</ReceivedTS>
    <SkipValidation>true</SkipValidation>
    <BatchID />
    <Action>EMPLUPD</Action>
    <ProcessType>generic</ProcessType>
    <CorrelationID>59637-update</CorrelationID>
    <ProcessingInstanceID>061b2b42-64c1-4a06-98de-f297949e4c06</ProcessingInstanceID>
    <RetryCount>1</RetryCount>
    <PreventResubmissionInd>true</PreventResubmissionInd>
  </EmployeeHeader>
  <ns0:NewHire>
    <ns0:TypeOfHire xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
    <ns0:NonStandardValue>E_EMPLUPD</ns0:NonStandardValue>
  </ns0:TypeOfHire>
    <ns0:EmployeeInfo xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
    <ns0:PersonName>
      <ns0:GivenName>some</ns0:GivenName>
      <ns0:PreferredGivenName />
      <ns0:FamilyName>newone</ns0:FamilyName>
      <ns0:MiddleName />
      <ns0:Affix type="salutation" />
    </ns0:PersonName>

    <IBKT_SYSID_PK xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">1234</IBKT_SYSID_PK>
  </ns0:NewHire>
</ns1:Employee>

Xpath, используемый внутри оркестровки:

sIBKTSysIDPK = xpath(msgEmployeeIn.msgEmployeeIn, "string(/*[local-name()='Employee' and namespace-uri()='http://Common_Employee_Schemas.Employee']/*[local-name()='NewHire' and namespace-uri()='http://ns.hr-xml.org/2007-04-15']/*[local-name()='IBKT_SYSID_PK' and namespace-uri()='http://www.w3.org/2001/XMLSchemainstance'][1])");

Поле sIBKTSysIDPK всегда возвращается пустым. Необходимо получить его значение 1234 и сохранить его в переменной.

1 Ответ

0 голосов
/ 27 февраля 2020

Ваш Xpath не совсем правильный IBKT_SYSID_PK имеет пустое пространство имен (без префикса пространства имен), поэтому правильный Xpath равен

/*[local-name()='KellyEmployee' and namespace-uri()='http://ECI.KellyCommon_Employee_Schemas.KellyEmployee']/*[local-name()='NewHire' and namespace-uri()='http://ns.hr-xml.org/2007-04-15']/*[local-name()='IBKT_SYSID_PK' and namespace-uri()=''][1]

Таким образом, ваш код должен быть

sIBKTSysIDPK = xpath(msgKellyEmployeeIn.msgKellyEmployeeIn, "string(/*[local-name()='KellyEmployee' and namespace-uri()='http://ECI.KellyCommon_Employee_Schemas.KellyEmployee']/*[local-name()='NewHire' and namespace-uri()='http://ns.hr-xml.org/2007-04-15']/*[local-name()='IBKT_SYSID_PK' and namespace-uri()=''][1])");
...