Xml 如何使用XSLT 2.0或XSLT 3.0使用模板匹配替换值

Xml 如何使用XSLT 2.0或XSLT 3.0使用模板匹配替换值,xml,xslt-2.0,xslt-3.0,Xml,Xslt 2.0,Xslt 3.0,我想根据标记cbc:TaxExemptionReasonCode中的值来更改XML中的输入值,如果这样的标记有11,12,13,14,15,16,21,31,32,33,34,35,36,37这样的值,那么标记cac:TaxScheme中的值必须更改为另一个值,如下所示 我使用XSLT 3.0尝试了模板匹配(也可以使用XSLT 2.0) 我的代码: 9996 政府科学研究机构联合会 弗雷 使用第一个模板匹配的缺点是以下模板不会生效。如果我评论第一个模板,那么下面的模板工作正常。我需要第一个模

我想根据标记cbc:TaxExemptionReasonCode中的值来更改XML中的输入值,如果这样的标记有11,12,13,14,15,16,21,31,32,33,34,35,36,37这样的值,那么标记cac:TaxScheme中的值必须更改为另一个值,如下所示

我使用XSLT 3.0尝试了模板匹配(也可以使用XSLT 2.0) 我的代码:


9996
政府科学研究机构联合会
弗雷
使用第一个模板匹配的缺点是以下模板不会生效。如果我评论第一个模板,那么下面的模板工作正常。我需要第一个模板的另一个原因,它没有意义解释在这篇文章

输入:

    <?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>

198
198
18
12
1000
IGV
增值税
所需输出:

    <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>

198
198
18
12
9996
政府科学研究机构联合会
弗雷
我应该怎么做才能获得所需的输出?
给我一些建议。

解决方案很简单:在第一个模板中更改行

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


然后所有后续模板都将被应用,样式表将按需要工作

这之所以有效,是因为您在代码中使用以下行定义了与标识模板等效的XSLT-3.0

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


它负责复制节点。

解决方案很简单:在第一个模板中更改行

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


然后所有后续模板都将被应用,样式表将按需要工作

这之所以有效,是因为您在代码中使用以下行定义了与标识模板等效的XSLT-3.0

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

它负责复制节点