带条件的 XSLT 复制元素

XSLT copy elements with condition

一开始我想知道这是否可以使用 xslt,如果可以,该怎么做:

我有两个 xml。 第一个是关于发票的信息

<INVOICES>
    <INVOICE>
        <INVOICE_NUMBER>FV2014000572</INVOICE_NUMBER>
        <SUPPLIER_NAME>Supplier 1</SUPPLIER_NAME>
    </INVOICE>
    <INVOICE>
        <INVOICE_NUMBER>FV2014000573</INVOICE_NUMBER>
        <SUPPLIER_NAME>Supplier 1</SUPPLIER_NAME>
    </INVOICE>
</INVOICES>

第二个是保存有关发票项目的具体信息

<INVOICE_ITEMS>
    <INVOICE_ITEM>
        <ITEM_INVOICE_NUMBER>FV2014000572</ITEM_INVOICE_NUMBER>
        <ITEM_NAME>ITEM 1</ITEM_NAME>
    </INVOICE_ITEM>
    <INVOICE_ITEM>
        <ITEM_INVOICE_NUMBER>FV2014000573</ITEM_INVOICE_NUMBER>
        <ITEM_NAME>ITEM 1</ITEM_NAME>
    </INVOICE_ITEM>
    <INVOICE_ITEM>
        <ITEM_INVOICE_NUMBER>FV2014000573</ITEM_INVOICE_NUMBER>
        <ITEM_NAME>ITEM 2</ITEM_NAME>
    </INVOICE_ITEM>
<INVOICE_ITEMS>

我想将这两个 xml 转换为一个格式如下:

<INVOICES>
    <INVOICE>
        <INVOICE_NUMBER>FV2014000572</INVOICE_NUMBER>
        <SUPPLIER_NAME>Supplier 1</SUPPLIER_NAME>
        <INVOICE_ITEMS>
            <INVOICE_ITEM>
                <ITEM_INVOICE_NUMBER>FV2014000572</ITEM_INVOICE_NUMBER>
                <ITEM_NAME>ITEM 1</ITEM_NAME>
            </INVOICE_ITEM>
        </INVOICE_ITEMS>
    </INVOICE>
    <INVOICE>
        <INVOICE_NUMBER>FV2014000573</INVOICE_NUMBER>
        <SUPPLIER_NAME>Supplier 1</SUPPLIER_NAME>
        <INVOICE_ITEMS>
            <INVOICE_ITEM>
                <ITEM_INVOICE_NUMBER>FV2014000573</ITEM_INVOICE_NUMBER>
                <ITEM_NAME>ITEM 1</ITEM_NAME>
            </INVOICE_ITEM>
            <INVOICE_ITEM>
                <ITEM_INVOICE_NUMBER>FV2014000573</ITEM_INVOICE_NUMBER>
                <ITEM_NAME>ITEM 2</ITEM_NAME>
            </INVOICE_ITEM>
        </INVOICE_ITEMS>
    </INVOICE>
</INVOICES>

如果可能,从最终 xml 中删除 ITEM_INVOICE_NUMBER 元素。

谢谢

这个非常基本的 样式表应该可以为您提供有关如何继续的线索。它将应用于您在输入中提供给我们的第一个 XML,并假定存储附加信息的第二个 XML 名为 data.xml

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:variable name="invoiceitems" select="document('data.xml')" />

    <!-- just copy the element, and process contents. Warning: attributes (if any) won't be processed. -->
    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="INVOICE">
        <xsl:variable name="current.invoice.number" select="INVOICE_NUMBER" />
        <xsl:copy>
            <xsl:apply-templates />
            <!-- create an INVOICE_ITEMS element, and start to retrieve information from the other XML -->
            <INVOICE_ITEMS>
                <xsl:apply-templates select="$invoiceitems//INVOICE_ITEM[ITEM_INVOICE_NUMBER/text() = $current.invoice.number]"></xsl:apply-templates>
            </INVOICE_ITEMS>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>