XSLT - у меня сопоставлено значение заголовка, и я хочу отобразить значение строки ниже - PullRequest
0 голосов
/ 25 января 2019

Я хочу, чтобы TaxTotal на InvoiceLine создавался в зависимости от значения заголовка. Затем я хочу, чтобы значение строки (LIT_VatExcludedAmount) было сопоставлено с правильной строкой (в TaxableAmount).

Я работаю только для отображения значения первой строки на каждую строку в цели. Или иметь все значения источника в каждой строке. Таким образом, для 3 строк по 3 результата в каждой строке.

Источник:

<Documents>
    <Document>
        <Invoice>
            <Fields>
                <Field Type="BTWverlegd" TextDetail="AE">Ja</Field>
            </Fields>
            <Tables>
                <Table>
                    <TableRow>
                        <Field Name="Li_Omschrijving" Type="LIT_ArticleName" PageNumber="1" Position="223,1528,377,1560">Artikel 1</Field>
                        <Field Name="Li_Aantal" Type="LIT_DeliveredQuantity" PageNumber="1" Position="1509,1530,1585,1566">3.00</Field>
                        <Field Name="Li_EenheidsPrijs" Type="LIT_UnitPriceAmount" PageNumber="1" Position="1832,1530,1908,1566">2.25</Field>
                        <Field Name="Li_NettoBedrag" Type="LIT_VatExcludedAmount" PageNumber="1" Position="2154,1530,2230,1566">6.75</Field>
                    </TableRow>
                    <TableRow>
                        <Field Name="Li_Omschrijving" Type="LIT_ArticleName" PageNumber="1" Position="223,1589,377,1621">Artikel 2</Field>
                        <Field Name="Li_Aantal" Type="LIT_DeliveredQuantity" PageNumber="1" Position="1509,1591,1585,1627">5.00</Field>
                        <Field Name="Li_EenheidsPrijs" Type="LIT_UnitPriceAmount" PageNumber="1" Position="1809,1591,1909,1627">28.00</Field>
                        <Field Name="Li_NettoBedrag" Type="LIT_VatExcludedAmount" PageNumber="1" Position="2109,1591,2229,1627">140.00</Field>
                    </TableRow>
                    <TableRow>
                        <Field Name="Li_Omschrijving" Type="LIT_ArticleName" PageNumber="1" Position="223,1649,376,1681">Artikel 3</Field>
                        <Field Name="Li_Aantal" Type="LIT_DeliveredQuantity" PageNumber="1" Position="1509,1651,1585,1687">7.00</Field>
                        <Field Name="Li_EenheidsPrijs" Type="LIT_UnitPriceAmount" PageNumber="1" Position="1810,1651,1910,1687">15.50</Field>
                        <Field Name="Li_NettoBedrag" Type="LIT_VatExcludedAmount" PageNumber="1" Position="2109,1651,2229,1687">108.50</Field>
                    </TableRow>
                </Table>
            </Tables>   
        </Invoice>      
    </Document>
</Documents>

XSLT код:

<xsl:for-each select="/Documents/Document/Invoice/Tables/Table/TableRow">
    <cac:InvoiceLine>
        <cbc:InvoicedQuantity>
            <xsl:value-of select="Field[@Type='LIT_DeliveredQuantity']"/>
        </cbc:InvoicedQuantity>
    <xsl:for-each select="../../../Fields/Field[@Type='BTWverlegd' and @TextDetail='AE']">
            <cac:TaxTotal>
                <cac:TaxSubtotal>
                    <cbc:TaxableAmount>
                        <xsl:for-each select="/Documents/Document/Invoice/Tables/Table/TableRow">
                            <xsl:value-of select="/Documents/Document/Invoice/Tables/Table/TableRow/Field[@Type='LIT_VatExcludedAmount']"/>
                        </xsl:for-each>
                    </cbc:TaxableAmount>
                </cac:TaxSubtotal>
            </cac:TaxTotal>
        </xsl:for-each>
    </cac:InvoiceLine>
</xsl:for-each>

Я ожидаю что-то вроде ниже, где каждая строка имеет правильный TaxableAmount. Я уже пробовал select = "Field [@ Type = 'LIT_VatExcludedAmount']", но тогда я получаю только пустой тег.

<Invoice>
    <cac:InvoiceLine>
        <cbc:InvoicedQuantity>3.00</cbc:InvoicedQuantity>
        <cac:TaxTotal>
            <cac:TaxSubtotal>
                <cbc:TaxableAmount currencyID="EUR">6.75</cbc:TaxableAmount>
            </cac:TaxSubtotal>
        </cac:TaxTotal>
    </cac:InvoiceLine>
    <cac:InvoiceLine>
        <cac:TaxTotal>
            <cbc:InvoicedQuantity>5.00</cbc:InvoicedQuantity>
            <cac:TaxSubtotal>
                <cbc:TaxableAmount currencyID="EUR">140.00</cbc:TaxableAmount>
            </cac:TaxSubtotal>
        </cac:TaxTotal>
    </cac:InvoiceLine>
    <cac:InvoiceLine>
        <cbc:ID/>
        <cbc:InvoicedQuantity>7.00</cbc:InvoicedQuantity>
        <cac:TaxTotal>
            <cac:TaxSubtotal>
                <cbc:TaxableAmount currencyID="EUR">108.50</cbc:TaxableAmount>
            </cac:TaxSubtotal>
        </cac:TaxTotal>
    </cac:InvoiceLine>
</Invoice>

1 Ответ

0 голосов
/ 25 января 2019

Возможно, вы захотите изменить внутренний xsl:for-each на xsl:if, в противном случае вы окажетесь на другом узле и потеряете то, что tableRow было позиционировано на

 <xsl:if test="../../../Fields/Field[@Type='BTWverlegd' and @TextDetail='AE']">

Кроме того, в вашем внутреннем xsl:for-each есть это xsl:value-of утверждение

<xsl:value-of select="/Documents/Document/....

Начиная выражение с /, вы игнорируете, какой узел вы выбрали в данный момент, и вместо этого ищите весь документ.

Тебе вообще не нужен xsl:for-each здесь. Просто это будет делать ...

<xsl:value-of select="Field[@Type='LIT_VatExcludedAmount']"/>

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:cac="cac"
    xmlns:cbc="cbc"
    version="1.0">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/">
    <xsl:for-each select="Documents/Document/Invoice/Tables/Table/TableRow">
        <cac:InvoiceLine>
            <cbc:InvoicedQuantity>
                <xsl:value-of select="Field[@Type='LIT_DeliveredQuantity']"/>
            </cbc:InvoicedQuantity>
            <xsl:if test="../../../Fields/Field[@Type='BTWverlegd' and @TextDetail='AE']">
                <cac:TaxTotal>
                    <cac:TaxSubtotal>
                        <cbc:TaxableAmount>
                            <xsl:value-of select="Field[@Type='LIT_VatExcludedAmount']"/>
                        </cbc:TaxableAmount>
                    </cac:TaxSubtotal>
                </cac:TaxTotal>
            </xsl:if>
        </cac:InvoiceLine>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
...