0

RECORD_TYPE ='ERROR'の場合、Record_Noによって各location_Nameの一意のレコード数を取得する方法。RECORD_NOに対してRECORD_TYPE='ERROR'のレコードが複数ある場合は、RECORD_NOに対して1つのレコードのみをカウントし、最後にこれらすべてのレコードをLOCATION_NAMEでグループ化する必要があります。これはxmlの日付です。

<root>
    <SellOutErrorRecord>
        <RECORD_TYPE>WARNING</RECORD_TYPE>
        <RECORD_NO>1</RECORD_NO>
            <ERROR_DESC>trx doc type is invalid</ERROR_DESC>
        <LOCATION_NAME>Chen Ken</LOCATION_NAME>
        <PRODUCT_NUMBER>336549R-001</PRODUCT_NUMBER>
    </SellOutErrorRecord>
    <SellOutErrorRecord>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>2</RECORD_NO>
            <ERROR_DESC>invoice amount is zero</ERROR_DESC>
        <LOCATION_NAME>Chen Ken</LOCATION_NAME>
        <PRODUCT_NUMBER>3X-KN73C-DB</PRODUCT_NUMBER>
    </SellOutErrorRecord>
        <SellOutErrorRecord>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
            <ERROR_DESC>sales qty is zero</ERROR_DESC>
        <RECORD_NO>2</RECORD_NO>
        <LOCATION_NAMEChen Ken</LOCATION_NAME>
        <PRODUCT_NUMBER>3X-KN73C-DB</PRODUCT_NUMBER>
    </SellOutErrorRecord>
    <SellOutErrorRecord>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <ERROR_DESC>trx currency is invalid</ERROR_DESC>
        <RECORD_NO>3</RECORD_NO>
        <LOCATION_NAME>Chen Ken</LOCATION_NAME>
        <PRODUCT_NUMBER>339112-B25</PRODUCT_NUMBER>
    </SellOutErrorRecord>
    <SellOutErrorRecord>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <ERROR_DESC>invoiced net amount is invalid</ERROR_DESC>
        <RECORD_NO>3</RECORD_NO>
        <LOCATION_NAME>Chen Ken</LOCATION_NAME>
        <PRODUCT_NUMBER>445860-B21</PRODUCT_NUMBER>
    </SellOutErrorRecord>
    <SellOutErrorRecord>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <ERROR_DESC>invoiced net amount is invalid</ERROR_DESC>
        <RECORD_NO>1</RECORD_NO>
        <LOCATION_NAME>Chen Ken</LOCATION_NAME>
        <PRODUCT_NUMBER>339112-B25</PRODUCT_NUMBER>
    </SellOutErrorRecord>
        <SellOutErrorRecord>
        <RECORD_TYPE>WARNING</RECORD_TYPE>
        <RECORD_NO>1</RECORD_NO>
            <ERROR_DESC>trx doc type is invalid</ERROR_DESC>
        <LOCATION_NAME>Cheng Boon</LOCATION_NAME>
        <PRODUCT_NUMBER>336549R-001</PRODUCT_NUMBER>
    </SellOutErrorRecord>
    <SellOutErrorRecord>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <RECORD_NO>2</RECORD_NO>
            <ERROR_DESC>invoice amount is zero</ERROR_DESC>
        <LOCATION_NAME>Cheng Boon</LOCATION_NAME>
        <PRODUCT_NUMBER>3X-KN73C-DB</PRODUCT_NUMBER>
    </SellOutErrorRecord>
        <SellOutErrorRecord>*-
        <RECORD_TYPE>ERROR</RECORD_TYPE>
            <ERROR_DESC>sales qty is zero</ERROR_DESC>
        <RECORD_NO>2</RECORD_NO>
        <LOCATION_NAME>Cheng Boon</LOCATION_NAME>
        <PRODUCT_NUMBER>3X-KN73C-DB</PRODUCT_NUMBER>
    </SellOutErrorRecord>
    <SellOutErrorRecord>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <ERROR_DESC>trx currency is invalid</ERROR_DESC>
        <RECORD_NO>3</RECORD_NO>
        <LOCATION_NAME>Cheng Boon</LOCATION_NAME>
        <PRODUCT_NUMBER>339112-B25</PRODUCT_NUMBER>
    </SellOutErrorRecord>
    <SellOutErrorRecord>
        <RECORD_TYPE>ERROR</RECORD_TYPE>
        <ERROR_DESC>invoiced net amount is invalid</ERROR_DESC>
        <RECORD_NO>3</RECORD_NO>
        <LOCATION_NAME>Cheng Boon</LOCATION_NAME>
        <PRODUCT_NUMBER>445860-B21</PRODUCT_NUMBER>
    </SellOutErrorRecord>
</root>

期待される出力は次のとおりです。

LOCATION_NAME:Chen Ken COUNT:3
LOCATION_NAME:Cheng Boon COUNT:2
4

1 に答える 1

1

これは、for-eachと呼び出しテンプレートを使用したかなりひどい解決策であり、ここで行ったのと同じ区別があります。アップストリームのデータプロバイダーにデータのクリーンアップを依頼することを検討してください。XSLTがこのようなデータの「デバウンス」に最適な場所かどうかはわかりません。XSLT1.0です。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="no"/>

    <xsl:template match="/root">
        <xsl:for-each select="*[LOCATION_NAME]">
            <xsl:variable name="LocationName" select="LOCATION_NAME/text()" />
            <xsl:if test="not(following::*[LOCATION_NAME/text()=$LocationName])" >
                <xsl:call-template name="CountGroup">
                    <xsl:with-param name="LocationName" select="$LocationName" />
                </xsl:call-template>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="CountGroup">
        <xsl:param name="LocationName"></xsl:param>
        LOCATION_NAME:<xsl:value-of select="$LocationName"/>
        COUNT <xsl:value-of select="count(//*[RECORD_TYPE='ERROR' and LOCATION_NAME=$LocationName 
                                              and not(following::*[RECORD_TYPE='ERROR' and LOCATION_NAME=$LocationName]
                                             /RECORD_NO/text() = RECORD_NO/text())])" />

    </xsl:template>
</xsl:stylesheet>

戻り値

LOCATION_NAME:Chen Ken COUNT 3
LOCATION_NAME:Cheng Boon COUNT 2
于 2012-09-19T15:15:01.640 に答える