Как игнорировать весь XML-контент на основе фильтров повторяющихся дочерних сегментов - PullRequest
0 голосов
/ 12 сентября 2018

Мне нужно игнорировать весь XML-контент, когда в одном теге ROW есть сегмент Group_2 с MATERIALSTATUS = Z7 и SALESORG = 1207.

Мой ввод xml приведен ниже.

<?xml version="1.0" encoding="UTF-8"?>
<RESULTS>
   <Groups>
      <Group_1>
         <RESULTSET_1>
            <ROW>
               <MATERIAL>12345</MATERIAL>
               <HARMCODE>3304.91.0000</HARMCODE>
               <ARTICLETYPE>005</ARTICLETYPE>
               <ARTICLESUBTYPE>014</ARTICLESUBTYPE>
               <MATCATGROUP/>
               <AUGROCERYPRODUCT/>
            </ROW>
         </RESULTSET_1>
      </Group_1>
      <Group_2>
         <RESULTSET_1>
            <ROW>
               <MATERIAL>12345</MATERIAL>
               <SALESORG>1119</SALESORG>
               <MATERIALSTATUS>Z7</MATERIALSTATUS>
            </ROW>
            <ROW>
               <MATERIAL>12345</MATERIAL>
               <SALESORG>1207</SALESORG>
               <MATERIALSTATUS>D4</MATERIALSTATUS>
            </ROW>
            <ROW>
               <MATERIAL>12345</MATERIAL>
               <SALESORG>1207</SALESORG>
               <MATERIALSTATUS>Z7</MATERIALSTATUS>
            </ROW>
         </RESULTSET_1>
      </Group_2>
   </Groups>
</RESULTS>

Поскольку этот XML-файл содержит сегмент Group_2 с MATERIALSTATUS = Z7 и SALESORG = 1207 в одном (третьем) теге ROW, мой желаемый вывод должен выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<RESULTS>
   <Groups/>
</RESULTS>

Мой код XSLT ниже:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" encoding="UTF-8"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <RESULTS>
            <xsl:for-each-group select="/RESULTS/Groups/*" group-by="*/ROW/MATERIAL">
                <Groups>
                    <xsl:choose>
                        <xsl:when test="(../Group_2/RESULTSET_1/ROW[MATERIALSTATUS = 'Z7'])">
                            <xsl:choose>
                                <xsl:when test="(../Group_2/RESULTSET_1/ROW[SALESORG = '1207'])">
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:copy-of select="current-group()"/>
                                </xsl:otherwise>
                            </xsl:choose>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:copy-of select="current-group()"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </Groups>
            </xsl:for-each-group>
        </RESULTS>
    </xsl:template>
</xsl:stylesheet>

Этот XSL работает для заданного XML-ввода.Но когда у меня SALESORG как 1207 (в одном сегменте ROW) и MATERIALSTATUS как Z7 (в другом сегменте ROW), я не хочу, чтобы вывод подавлялся.Но мой XSL подавляет весь XML, ища 1207 во всех 3 тегах.

Пожалуйста, помогите мне понять, что я могу сделать, чтобы добиться этого?Спасибо.

1 Ответ

0 голосов
/ 12 сентября 2018

Я думаю, вы можете просто проверить, содержит ли current-group() такой ROW, а затем ничего не копировать:

<xsl:template match="/">
    <RESULTS>
        <xsl:for-each-group select="/RESULTS/Groups/*" group-by="*/ROW/MATERIAL">
            <Groups>
                <xsl:copy-of
                  select="if (current-group()[self::Group_2/RESULTSET_1/ROW[MATERIALSTATUS = 'Z7' and SALESORG = 1207]])
                          then () else current-group()"/>
            </Groups>
        </xsl:for-each-group>
    </RESULTS>
</xsl:template>

https://xsltfiddle.liberty -development.net / 6qVRKwF

Можно также написать это как

<xsl:template match="/">
    <RESULTS>
        <xsl:for-each-group select="/RESULTS/Groups/*" group-by="*/ROW/MATERIAL">
            <Groups>
                <xsl:copy-of
                  select="current-group()[not(some $row in current-group()[self::Group_2]/RESULTSET_1/ROW satisfies $row/MATERIALSTATUS = 'Z7' and $row/SALESORG = 1207)]"/>
            </Groups>
        </xsl:for-each-group>
    </RESULTS>
</xsl:template>

https://xsltfiddle.liberty -development.net / 6qVRKwF / 1 или, конечно, используйте xsl:choose.

...