Встроенный XSLT 1.0 Счетчик при повторении записи Карта BizTalk

У меня проблема с написанием встроенного XSLT 1.0 в моем проекте BizTalk. Я пытаюсь получить счет для состояния поля, если оно равно INactive, ниже приведены входной xml, ожидаемый xml и XSLT, что я пробовал

Входной XML:

<ns0:Root xmlns:ns0="http://Test">
    <ns0:Source>EXT</ns0:Source>
    <ns0:Lines>
        <ns0:Code>A</ns0:Code>
        <ns0:Status>Active</ns0:Status>
    </ns0:Lines>
    <ns0:Lines>
        <ns0:Code>A</ns0:Code>
        <ns0:Status>Active</ns0:Status>
    </ns0:Lines>
    <ns0:Lines>
        <ns0:Code>A</ns0:Code>
        <ns0:Status>InActive</ns0:Status>
    </ns0:Lines>
    <ns0:Lines>
        <ns0:Code>A</ns0:Code>
        <ns0:Status>InActive</ns0:Status>
    </ns0:Lines>
        <ns0:Lines>
        <ns0:Code>A</ns0:Code>
        <ns0:Status>InActive</ns0:Status>
    </ns0:Lines>
</ns0:Root>

Ожидаемый результат:

<ns0:Root xmlns:ns0="http://TestOutPut">
  <Count>3</Count>
</ns0:Root>

Встроенный XSLT (скрипт Functoid):

<xsl:element name="Count"><xsl:value-of select = "count(Lines[Status='Inactive'])" /></xsl:element>

Условие: получить номер статуса (количество), если статус = 'Неактивно'

Помогите мне, не знаю, где я делаю это неправильно


person sukra    schedule 10.07.2020    source источник


Ответы (2)


Для встроенного XSLT с использованием функции сценариев вам необходимо иметь следующее, где вам нужно включить локальное имя, а также использовать функцию text() в условии.

<xsl:variable name="count" select="count(/*[local-name()='Root' and namespace-uri()='http://Test']/*[local-name()='Lines' and namespace-uri()='http://Test']/*[local-name()='Status' and namespace-uri()='http://Test'][text()='InActive'])" />

<Count><xsl:copy-of select="$count" /></Count>

Вы можете получить правильный путь XSLT, щелкнув узел на карте и скопировав XPath экземпляра из окна свойств.

Вы можете удалить namespace-uri, чтобы упростить его, если нет нескольких пространств имен, вызывающих проблемы.

<xsl:variable name="count" select="count(/*[local-name()='Root']/*[local-name()='Lines']/*[local-name()='Status'][text()='InActive'])" />

<Count><xsl:copy-of select="$count" /></Count>

Примечание. XSLT чувствителен к регистру, поэтому Inactive и InActive не равны.

person Dijkgraaf    schedule 12.07.2020

Поскольку требуется изменить целевое пространство имен на http://TestOutPut, затем используйте переменную для хранения значения из предыдущего пространства имен http://Test.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://Test">
    <xsl:template match="ns0:Root">
        <xsl:variable name="count" select="count(ns0:Lines[ns0:Status='InActive'])" />
        <ns0:Root xmlns:ns0="http://TestOutPut">
            <Count><xsl:copy-of select="$count" /></Count>
        </ns0:Root>
    </xsl:template> 
</xsl:stylesheet>
person Miller Cy Chan    schedule 10.07.2020
comment
Да: count(ns0:Lines[ns0:Status='InActive']). - person michael.hor257k; 10.07.2020
comment
И вы можете начать с <xsl:template match="/ns0:Root"> и избавиться от xsl:for-each. - person michael.hor257k; 10.07.2020
comment
@ michael.hor257k xsl:stylesheet 'не может быть дочерним элементом элемента 'xsl:stylesheet'. Это ошибка, которую я получаю, когда использую встроенный xslt с помощью функтоида скрипта. - person sukra; 10.07.2020
comment
@sukra Почему ваш комментарий адресован мне? Я ничего не знаю о BizTalk, встроенном XSLT или функтоидах сценариев, поэтому я не ответил на ваш вопрос. - person michael.hor257k; 10.07.2020
comment
Если вы используете пользовательский путь XSLT к файлу xsl на карте, ответ выше правильный. Для встроенного XSLT см. Мой ответ. - person Dijkgraaf; 12.07.2020