XPath в BizTalk возвращает объединенные строковые значения. Хотите элементы и ценности - PullRequest
0 голосов
/ 22 октября 2009

У меня есть сообщение, которое выглядит, например, так, но может содержать в себе гораздо больше счетов:

<ns1:InvoicesEnvelope xmlns:ns1="http://Test.Schemas.InvoiceEnvelope_1"xmlns:ns0="http://Test.Schemas.Invoices">
<Invoices>
<ns0:Invoice>
<Header>
   <BatchID>1311</BatchID>
   <InvoiceNo>3400055151</InvoiceNo>
   <CustomerName>CUSNAME1</CustomerName>
   <TotalInvoiceLines>2</TotalInvoiceLines>
</Header>
   <Lines>
      <Line>
          <TaxCode>S15</TaxCode>
          <InvoiceAmt>12.77</InvoiceAmt>
      </Line>
      <Line>
          <TaxCode>S15</TaxCode>
          <InvoiceAmt>1.92</InvoiceAmt>
      </Line>
   </Lines>
</ns0:Invoice>
<ns0:Invoice>
<Header>
   <BatchID>1311</BatchID>
   <InvoiceNo>3400055152</InvoiceNo>
   <CustomerName>CUSNAME2</CustomerName>
   <TotalInvoiceLines>2</TotalInvoiceLines>
</Header>
   <Lines>
      <Line>
          <TaxCode>S15</TaxCode>
          <InvoiceAmt>12.77</InvoiceAmt>
      </Line>
      <Line>
          <TaxCode>S15</TaxCode>
          <InvoiceAmt>1.92</InvoiceAmt>
      </Line>
   </Lines>
 </ns0:Invoice>
</Invoices>
</ns1:InvoicesEnvelope>

Все, что я хочу сделать, это получить 2-й счет из исходного сообщения, используя xpath

Вот мой Xpath:

msgInvoice = xpath(msgInvoicesEnvelope, "string  (//ns1:InvoicesEnvelope/Invoices/ns0:Invoice[position() = 2])”);

Все, что он возвращает, это фактические строковые значения, соединенные вместе, вот так:

13113400055152CUSNAME22S1512.77S151.92

Что я хочу, так это теги элементов, чтобы их можно было вставить в новое сообщение с одним счетом. Вот что я ожидаю получить:

<ns0:Invoice>
<Header>
   <BatchID>1311</BatchID>
   <InvoiceNo>3400055152</InvoiceNo>
   <CustomerName>CUSNAME2</CustomerName>
   <TotalInvoiceLines>2</TotalInvoiceLines>
</Header>
   <Lines>
      <Line>
          <TaxCode>S15</TaxCode>
          <InvoiceAmt>12.77</InvoiceAmt>
      </Line>
      <Line>
          <TaxCode>S15</TaxCode>
          <InvoiceAmt>1.92</InvoiceAmt>
      </Line>
   </Lines>
 </ns0:Invoice>
</Invoices>

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 25 октября 2009

Я нашел решение проблемы. Это было очень просто.

Соответствует используемому выражению XPath.

Вместо того чтобы сказать

msgInvoice = xpath(msgInvoicesEnvelope, "string  (//ns1:InvoicesEnvelope/Invoices/ns0:Invoice[position() = 2])”);

Пропустить строку и вернуть значения вместе с их элементами.

msgInvoice = xpath(msgInvoicesEnvelope, "//ns1:InvoicesEnvelope/Invoices/ns0:Invoice[position() = 2]”);
0 голосов
/ 22 октября 2009

Ваш XPath правильный; возможно, ваша проблема в том, как вы запрашиваете данные XML;

Например, в C #, если я запускаю ваш XPath и запрашиваю свойство .InnerText, я получу тот же поддельный результат; но, если я возьму этот результат как XmlElement, я могу обработать его правильно.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...