BizTalk Map: xslt 1.0 sum "Невозможно неявно преобразовать тип 'string' в 'int'" - PullRequest
0 голосов
/ 08 марта 2019

Получить ошибку:

Невозможно неявно преобразовать тип 'string' в 'int'

по этому коду:

<TotalInvoiceCost>
    <xsl:value-of select="sum(//*[local-name()='InvoiceTotal'])" />
</TotalInvoiceCost>

Тогда попробовал это:

   <TotalInvoiceCost>
      <xsl:value-of select="sum(number(//*[local-name()='InvoiceTotal']))" />
   </TotalInvoiceCost>

но получите эту ошибку:

Аргумент 1 функции sum () нельзя преобразовать в набор узлов.

Сокращение выборки данных со структурой (все значения являются числовыми):

<TAR210 xmlns="demo">
    <DummyHeaderGroup xmlns=""/>
    <Invoice xmlns="">
        <Level1>
            <InvoiceTotal>1075</InvoiceTotal>
        </Level1>
        <Level1>
            <InvoiceTotal>595</InvoiceTotal>
        </Level1>
    </Invoice>
</TAR210>

В http://www.xpathtester.com/xpath, это отлично работает:

сумма (// * [имя локального () = "InvoiceTotal"])

Пример XSLT в контексте:

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
  exclude-result-prefixes="msxsl var userCSharp" version="1.0"
  xmlns:ns0="demo"
  xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp">

  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />

  <xsl:template match="/">
    <ns0:TAR210>
      <DummyHeaderGroup>
        <Level0>
          <TotalInvoiceCost>
            <xsl:value-of select="sum(//*[local-name()='InvoiceTotal'])" />
          </TotalInvoiceCost>
        </Level0>
      </DummyHeaderGroup>
    </ns0:TAR210>
  </xsl:template>

</xsl:stylesheet>

1 Ответ

0 голосов
/ 12 марта 2019

Что ж, программа реального мира, как правило, более сложная, чем та, которую мы публикуем в Интернете, когда у нас возникает проблема;Я пытался упростить.Ошибка не имеет ничего общего с кодом, который я разместил.

Мне кажется, что самая большая проблема заключается в том, что ошибка «Тестовой карты» в Visual Studio не дает никакого указания на номер строки с ошибкой.

<Level0>
  <BatchNumberLeaveBlank></BatchNumberLeaveBlank>
  <InvoiceSendDateCCYYMM>
    <!-- Get current CCYYMM -->
          <!-- Current-DateTime doesn't exist in XSLT 1.0, had to use C# 
          <xsl:value-of  select="concat(substring(current-dateTime(),1,4),substring(current-dateTime(),6,2))"/>
          --> 
          <xsl:value-of  select="userCSharp:GetDateCCYYMM()"/>
  </InvoiceSendDateCCYYMM>
  <DefaultValueN>N</DefaultValueN>
  <TotalInvoiceCost>...

Тогда у меня был код C # ниже:

  <msxsl:script language="C#" implements-prefix="userCSharp">
<![CDATA[ int lineCount = 0;

public int GetDateCCYYMM()
   {
       return DateTime.Now.ToString("yyyyMMdd");
   }

  ]]> 
  </msxsl:script>

Очевидно, "public int" должен был быть "public string" выше.

Единственный способ, которым я знаю, как решить эти проблемы, - это метод «разделяй и властвуй».Я сделал копию XSLT, назвал ее так же, как _Debug.xslt, изменил карту BizTalk, чтобы использовать ее вместо этого, и начал вырывать строки кода влево и вправо, пока ошибка не исчезнет.Даже удаление вызова c # не устранило ошибку, поэтому он должен был выполнять компиляцию .NET или проверку синтаксиса кода.

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