带条件的 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>
一开始我想知道这是否可以使用 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>