Как обрабатывать отдельные элементы XML с использованием XSL - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь обработать следующий XML для отображения каждой записи Discount с каждым MerchandiseItem с помощью XSLT:

ПРИМЕЧАНИЕ. За каждым MerchandiseItem всегда следует 0 или более элементов Discount

Пример XML:

<IBMGSA xmlns="http://www.omnicogroup.com/FPF/namespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <transaction>
        <MerchandiseItem Record="2">
            <Identifier>
                <SalePrc>6.14</SalePrc>
                <Quantity>1.00</Quantity>
                <NetQuantity>1.00</NetQuantity>
                <SaleQuantity>1</SaleQuantity>
                <SalePrice>6.14</SalePrice>
                <Penny>.01</Penny>
                <Zero>0.00</Zero>
                <IsVoided>0</IsVoided>
                <VoidedQuantity>0.00</VoidedQuantity>
            06</Identifier>
            <ItemCode>
                <ItemCodeGTIN14>00000000000083</ItemCodeGTIN14>
                <ItemCodeGTIN12>000000000008</ItemCodeGTIN12>
                <Sku>000000008</Sku>
                <SkuType>3</SkuType>
                <SkuByte>1</SkuByte>
                <SuppressRecord>NO</SuppressRecord>
                <ItemDescription>ZIL PLAY A-</ItemDescription>
                <ItemDescTrimmed>ZIL PLAYA-SYS</ItemDescTrimmed>
            1000000000000000000083</ItemCode>
            <Department>
                <DeptSuppress>YES</DeptSuppress>
            182</Department>
            <ItemAmount>
                <NegativeTransaction>0</NegativeTransaction>
                <ItemAmount>7.68</ItemAmount>
                <ItemDiscountCode>2</ItemDiscountCode>
                <ItemDiscountAmount>1.54</ItemDiscountAmount>
                <ItemDiscountPercent>20.0</ItemDiscountPercent>
                <ItemAmt>7.68</ItemAmt>
                <ItemDisAmt>6.14</ItemDisAmt>
            </ItemAmount>   <!-- Added by edit -->
        </MerchandiseItem>
        <Discount Record="3">
            <Identifier>10</Identifier>
            <DiscountCode>2</DiscountCode>
            <DiscountAmount>
                <DiscountAmountType>PE</DiscountAmountType>
                <DiscountQuantity>1</DiscountQuantity>
                <NegativeTransaction>0</NegativeTransaction>
                <DiscountAmount>1.54</DiscountAmount>
                <TaxExemptAmount>0.00</TaxExemptAmount>
                <ABSDiscountAmt>1.54</ABSDiscountAmt>
            154</DiscountAmount>
            <DiscountPercent>
                <DiscountPercent>20.0</DiscountPercent>
            200</DiscountPercent>
        </Discount>
        <Discount Record="4">
            <Identifier>10</Identifier>
            <DiscountCode>25</DiscountCode>
        </Discount>
        ...
        ...
        ...
    </transaction>
</IBMGSA>                   <!-- Added by edit -->

Как я могу пройти элементы DiscountItem при переборе каждого элемента MerchandiseItem, учитывая, что элементы DiscountItem всегда идут после элемента MerchandiseItem и должны быть связаны / отображаться только с этим MerchandiseItem?

Мне нужно, чтобы вывод был следующим (ссылка на этот образец XML) - спасибо за переформатирование!Спасибо - правильный вывод HTML (версия 5) должен быть:

<html>
<body>
<table>
<tr>
ZIL PLAY A-                                             
00000000000083    1 @ 7.68                   7.68                              
10  (20 %) OFF 00000000000083                1.54-
25  (5 %) OFF 00000000000083                  .31-
</tr>
</table>
</body>
</html>

XML-эквивалент вывода выше:

<ItemDescription>ZIL PLAY A-</ItemDescription>
<ItemCodeGTIN14>00000000000083</ItemCodeGTIN14>    <Quantity>1.00</Quantity> @   <ItemAmount>7.68</ItemAmount>

<Identifier>10</Identifier> (<DiscountPercent>20.0 %</DiscountPercent>) OFF <ItemCodeGTIN14>00000000000083</ItemCodeGTIN14>  <DiscountAmount>1.54</DiscountAmount>-
<Identifier>25</Identifier> (<DiscountPercent>5 %</DiscountPercent>) OFF <ItemCodeGTIN14>00000000000083</ItemCodeGTIN14> <DiscountAmount>.31</DiscountAmount>-

Используя предложение в комментариях от @ michael.hor257k, яя пытаюсь отобразить информацию MerchandiseItem и Discount с помощью следующего XSL (обновлен, чтобы быть более понятным - надеюсь - как я хочу сгруппировать и отобразить перечисленные выше DiscountItem и MerchandiseItems:

<?xml version="1.0"?>
<xsl:stylesheet xmlns="http://www.omnicogroup.com/FPF/namespace" 
xmlns:ns1="http://www.omnicogroup.com/FPF/namespace" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml"/>
       <xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <meta name="viewport" content="width=device-width, initial-scale=1.0" />

        </head>
        <body>
             <table>
               <tr>
                  <xsl:for-each-group select="*" group-starting-
              with="MerchandiseItem">

                  <b>Here is a MerchItem</b><br/> <!--Should repeat (16 times as there are 16 total MerchandiseItem elements in my XML payload. Currently -nothing is displayed and it does not appear that this for-each group is being entered at runtime)-->

                  </xsl:for-each-group>
               </tr>
          </table>
        </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

, но ничего не отображаетсяиспользуя тот же пример XML. Мои циклы for-each неправильно ссылаются на группы MerchandiseItem / Discount?

1 Ответ

0 голосов
/ 26 июня 2019

Вот пример XSLT 3 (я думаю, что я не использовал никаких функций XSLT 3, поэтому должен работать и с процессором XSLT 2), который показывает, как применить for-each-group group-starting-with в некотором контексте для группировки и вывода данных:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="#all"
        xpath-default-namespace="http://www.omnicogroup.com/FPF/namespace"
        version="3.0">


    <xsl:output method="html" indent="yes" html-version="5"/>

    <xsl:template match="/">
        <html>
            <head>
                <title>.NET XSLT Fiddle Example</title>
            </head>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="transaction">
        <table>
            <thead>
                <tr>
                    <th/>
                </tr>
            </thead>
            <xsl:for-each-group select="*" group-starting-with="MerchandiseItem">
                <tbody>
                    <xsl:apply-templates select="current-group()[self::Discount]">
                        <xsl:with-param name="merch-item" select="."/>
                    </xsl:apply-templates>
                </tbody>
            </xsl:for-each-group>
        </table>
    </xsl:template>

    <xsl:template match="Discount">
        <xsl:param name="merch-item"/>
        <tr>
            <td valign="top" align="left" style="font-size:14px;line-height:18px;">
                <xsl:value-of select="$merch-item/ItemCode/ItemDescription"/>
                <br />
                <xsl:value-of select="$merch-item/ItemCode/ItemCodeGTIN14"/>&#160;

                <xsl:value-of select="floor($merch-item/Identifier/Quantity)"/> @ <xsl:value-of 
    select="$merch-item/ItemAmount/ItemAmount div $merch-item/Identifier/Quantity"/>

                <xsl:value-of select="Identifier, DiscountPercent/DiscountPercent"/>
            </td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / ej9EGd3

Я понимаю, что формат вывода не тот, который вы показали, но я не могу понять издва разных фрагмента, которые форматируют именно то, что вам нужно, в примере показано, как использовать конструкцию группировки, а также обработать каждый элемент Discount в каждой группе для вывода некоторого значения, предоставляя доступ к MerchandiseItem, начиная с каждой группы, так что, надеюсь, этого будет достаточно, чтобыВы должны сформировать это в правильном формате самостоятельно.

...