Как заменить значения с помощью шаблонов соответствия с помощью XSLT 2.0 или XSLT 3.0 - PullRequest
0 голосов
/ 24 января 2019

Я хочу изменить входное значение из XML в зависимости от значения из тега cbc: TaxExemptionReasonCode, если такой тег имеет значения, такие как 11,12,13,14,15,16,21,31,32,33,34, 35,36,37 затем значение внутри тега cac: TaxScheme должно измениться на другое значение, как я покажу ниже.

Я пробовал с сопоставлением с шаблоном с использованием XSLT 3.0 (это также может быть с XSLT2.0) Мой код:

<xsl:mode on-no-match="shallow-copy" />
<xsl:template match="cac:TaxTotal">
    <xsl:variable name="taxTotal" select="../cac:TaxTotal"/>
    <xsl:copy>
        <xsl:copy-of select="$taxTotal[cac:TaxSubtotal/cac:TaxCategory/cac:TaxScheme/cbc:ID[text()='1000']]/cbc:TaxAmount"/>
        <xsl:for-each select="$taxTotal">
            <xsl:copy-of select="cac:TaxSubtotal"/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>
<xsl:template match="cac:TaxScheme[../cbc:TaxExemptionReasonCode[matches(text(), '^(11|12|13|14|15|16|21|31|32|33|34|35|36|37)$')]]">
    <xsl:copy>
        <cbc:ID>9996</cbc:ID>
        <cbc:Name>GRA</cbc:Name>
        <cbc:TaxTypeCode>FRE</cbc:TaxTypeCode>
    </xsl:copy>
</xsl:template>

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

Ввод:

    <?xml version="1.0" encoding="utf-8" standalone="no"?>
<Invoice
    xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
    xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
    xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
    <cac:TaxTotal>
        <cbc:TaxAmount currencyID="PEN">198.00</cbc:TaxAmount>
        <cac:TaxSubtotal>
            <cbc:TaxAmount currencyID="PEN">198.00</cbc:TaxAmount>
            <cbc:Percent>18.00</cbc:Percent>
            <cac:TaxCategory>
                <cbc:TaxExemptionReasonCode>12</cbc:TaxExemptionReasonCode>
                <cac:TaxScheme>
                    <cbc:ID>1000</cbc:ID>
                    <cbc:Name>IGV</cbc:Name>
                    <cbc:TaxTypeCode>VAT</cbc:TaxTypeCode>
                </cac:TaxScheme>
            </cac:TaxCategory>
        </cac:TaxSubtotal>
    </cac:TaxTotal>
</Invoice>

Требуется вывод:

    <Invoice
    xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
    xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
    xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
    <cac:TaxTotal>
        <cbc:TaxAmount currencyID="PEN">198.00</cbc:TaxAmount>
        <cac:TaxSubtotal>
            <cbc:TaxAmount currencyID="PEN">198.00</cbc:TaxAmount>
            <cbc:Percent>18.00</cbc:Percent>
            <cac:TaxCategory>
                <cbc:TaxExemptionReasonCode>12</cbc:TaxExemptionReasonCode>
                <cac:TaxScheme>
                    <cbc:ID>9996</cbc:ID>
                    <cbc:Name>GRA</cbc:Name>
                    <cbc:TaxTypeCode>FRE</cbc:TaxTypeCode>
                </cac:TaxScheme>
            </cac:TaxCategory>
        </cac:TaxSubtotal>
    </cac:TaxTotal>
</Invoice>

что следуетЯ делаю, чтобы получить желаемый результат?Дайте мне какие-либо предложения.

1 Ответ

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

Решение простое: в первом шаблоне измените строку

<xsl:copy-of select="cac:TaxSubtotal"/>

до

<xsl:apply-templates select="cac:TaxSubtotal"/>

Тогда все последующие шаблоны будут применены, и ваша таблица стилей будет работать так, как вам нужно.

Это работает, потому что у вас есть XSLT-3.0 эквивалент шаблона идентификации , определенный в вашем коде со строкой

<xsl:mode on-no-match="shallow-copy" />

, который заботится о копировании узлов.

...