Необходимо получить количество записей, когда record_type=VALID через XSLT

У меня есть данные ниже xml и мне нужно получить количество записей, когда record_type=VALID через XSLT. location_name и file_type являются входными данными для xslt. Я должен получить количество записей для каждого location_name и file_type, когда они были предоставлены в качестве входных данных. Location_Name и File_Type являются переменными в XSLT.

<root>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>1</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>2</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>3</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>WARNING</RECORD_TYPE>
    <RECORD_NO>3</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>4</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>6</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>7</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>8</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>9</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</SellOutRecord>
<SellOutRecord>
    <FILE_TYPE>STOSO</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>10</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</SellOutRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>2</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>4</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>5</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>8</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>9</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>11</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</InventoryRecord>
<InventoryRecord>
    <FILE_TYPE>STOIV</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>14</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</InventoryRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>1</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>2</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>3</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>WARNING</RECORD_TYPE>
    <RECORD_NO>3</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>4</RECORD_NO>
    <LOCATION_NAME>XYZ el</LOCATION_NAME>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>7</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>VALID</RECORD_TYPE>
    <RECORD_NO>8</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>WARNING</RECORD_TYPE>
    <RECORD_NO>8</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</SalesInRecord>
<SalesInRecord>
    <FILE_TYPE>STOSI</FILE_TYPE>
    <RECORD_TYPE>ERROR</RECORD_TYPE>
    <RECORD_NO>10</RECORD_NO>
    <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
</SalesInRecord>
</root>

ожидаемый результат: Rec_count=2 для location_name=XYZ el и File_type=STOSO Rec_count=3 для location_name=XYZ XYZ и File_type = STOSO

Спасибо...

1 ответ

Разыскиваемые выражения XPath:

count(/*/*
         [RECORD_TYPE='VALID' and LOCATION_NAME=$pLoc1 and FILE_TYPE=$pFType])

и:

count(/*/*
         [RECORD_TYPE='VALID' and LOCATION_NAME=$pLoc2 and FILE_TYPE=$pFType])

Это преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:param name="pLoc1" select="'XYZ el'"/>
 <xsl:param name="pLoc2" select="'XYZ XYZ'"/>
 <xsl:param name="pFType" select="'STOSO'"/>

 <xsl:variable name="vCount1" select=
  "count(/*/*
         [RECORD_TYPE='VALID' and LOCATION_NAME=$pLoc1 and FILE_TYPE=$pFType])"/>

 <xsl:variable name="vCount2" select=
  "count(/*/*
         [RECORD_TYPE='VALID' and LOCATION_NAME=$pLoc2 and FILE_TYPE=$pFType])"/>

 <xsl:template match="node()|@*">
     <xsl:copy-of select="concat($vCount1, ', ', $vCount2)"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML:

<root>
    <SellOutRecord>
        <FILE_TYPE>STOSO</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>1</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </SellOutRecord>
    <SellOutRecord>
        <FILE_TYPE>STOSO</FILE_TYPE>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>2</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </SellOutRecord>
    <SellOutRecord>
        <FILE_TYPE>STOSO</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>3</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </SellOutRecord>
    <SellOutRecord>
        <FILE_TYPE>STOSO</FILE_TYPE>
        <RECORD_TYPE>WARNING</RECORD_TYPE>
        <RECORD_NO>3</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </SellOutRecord>
    <SellOutRecord>
        <FILE_TYPE>STOSO</FILE_TYPE>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>4</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </SellOutRecord>
    <SellOutRecord>
        <FILE_TYPE>STOSO</FILE_TYPE>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>6</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </SellOutRecord>
    <SellOutRecord>
        <FILE_TYPE>STOSO</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>7</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </SellOutRecord>
    <SellOutRecord>
        <FILE_TYPE>STOSO</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>8</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </SellOutRecord>
    <SellOutRecord>
        <FILE_TYPE>STOSO</FILE_TYPE>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>9</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </SellOutRecord>
    <SellOutRecord>
        <FILE_TYPE>STOSO</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>10</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </SellOutRecord>
    <InventoryRecord>
        <FILE_TYPE>STOIV</FILE_TYPE>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>2</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </InventoryRecord>
    <InventoryRecord>
        <FILE_TYPE>STOIV</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>4</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </InventoryRecord>
    <InventoryRecord>
        <FILE_TYPE>STOIV</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>5</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </InventoryRecord>
    <InventoryRecord>
        <FILE_TYPE>STOIV</FILE_TYPE>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>8</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </InventoryRecord>
    <InventoryRecord>
        <FILE_TYPE>STOIV</FILE_TYPE>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>9</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </InventoryRecord>
    <InventoryRecord>
        <FILE_TYPE>STOIV</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>11</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </InventoryRecord>
    <InventoryRecord>
        <FILE_TYPE>STOIV</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>14</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </InventoryRecord>
    <SalesInRecord>
        <FILE_TYPE>STOSI</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>1</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </SalesInRecord>
    <SalesInRecord>
        <FILE_TYPE>STOSI</FILE_TYPE>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>2</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </SalesInRecord>
    <SalesInRecord>
        <FILE_TYPE>STOSI</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>3</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </SalesInRecord>
    <SalesInRecord>
        <FILE_TYPE>STOSI</FILE_TYPE>
        <RECORD_TYPE>WARNING</RECORD_TYPE>
        <RECORD_NO>3</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </SalesInRecord>
    <SalesInRecord>
        <FILE_TYPE>STOSI</FILE_TYPE>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>4</RECORD_NO>
        <LOCATION_NAME>XYZ el</LOCATION_NAME>
    </SalesInRecord>
    <SalesInRecord>
        <FILE_TYPE>STOSI</FILE_TYPE>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>7</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </SalesInRecord>
    <SalesInRecord>
        <FILE_TYPE>STOSI</FILE_TYPE>
        <RECORD_TYPE>VALID</RECORD_TYPE>
        <RECORD_NO>8</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </SalesInRecord>
    <SalesInRecord>
        <FILE_TYPE>STOSI</FILE_TYPE>
        <RECORD_TYPE>WARNING</RECORD_TYPE>
        <RECORD_NO>8</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </SalesInRecord>
    <SalesInRecord>
        <FILE_TYPE>STOSI</FILE_TYPE>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>10</RECORD_NO>
        <LOCATION_NAME>XYZ XYZ</LOCATION_NAME>
    </SalesInRecord>
</root>

оценивает два выражения XPath и копирует на выход результат этой оценки:

2, 3
Другие вопросы по тегам