xml - XSLT 1.0 中从平面到嵌套 XML 的转换
问题描述
我有以下平面 xml 结构
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Main xmlns:ns0="urn:test">
<RECORDSET>
<Item>
<Number>00011111</Number>
<rowNumber>00001</rowNumber>
<Product>Product 1</Product>
</Item>
<Item>
<Number>00011111</Number>
<rowNumber>00002</rowNumber>
<Product>Product 2</Product>
</Item>
<Item>
<Number>00099999</Number>
<rowNumber>00001</rowNumber>
<Product>Product 3</Product>
</Item>
<Tax>
<Number>00011111</Number>
<taxRowNumber>00001</taxRowNumber>
<TaxType>TAX1</TaxType>
<Amount>100</Amount>
</Tax>
<Tax>
<Number>00011111</Number>
<taxRowNumber>00001</taxRowNumber>
<TaxType>TAX2</TaxType>
<Amount>200</Amount>
</Tax>
<Tax>
<Number>00099999</Number>
<taxRowNumber>00001</taxRowNumber>
<TaxType>TAX2</TaxType>
<Amount>110</Amount>
</Tax>
</RECORDSET>
</ns0:Main>
我需要以下结果。每个<Tax>
元素都必须在适当<Item>
的内部移动(具有相同Number
和rowNumber
信息的元素)
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Main xmlns:ns0="urn:test">
<RECORDSET>
<Item>
<Number>00011111</Number>
<rowNumber>00001</rowNumber>
<Product>Product 1</Product>
<Tax>
<Number>00011111</Number>
<taxRowNumber>00001</taxRowNumber>
<TaxType>TAX1</TaxType>
<Amount>100</Amount>
</Tax>
<Tax>
<Number>00011111</Number>
<taxRowNumber>00001</taxRowNumber>
<TaxType>TAX2</TaxType>
<Amount>200</Amount>
</Tax>
</Item>
<Item>
<Number>00011111</Number>
<rowNumber>00002</rowNumber>
<Product>Product 2</Product>
</Item>
<Item>
<Number>00099999</Number>
<rowNumber>00001</rowNumber>
<Product>Product 3</Product>
<Tax>
<Number>00099999</Number>
<taxRowNumber>00001</taxRowNumber>
<TaxType>TAX2</TaxType>
<Amount>110</Amount>
</Tax>
</Item>
</RECORDSET>
</ns0:Main>
我认为我可以使用以下 XSLT 轻松获得所需的内容(必须使用XSLT 1.0 版),但该<Tax>
元素从未出现。
我尝试了很多更改,但没有一个是正确的。
我还发现了很多“平面到嵌套 XML”的问题,但没有运气
<?xml version="1.0"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="urn:test">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<ns0:Main>
<RECORDSET>
<xsl:for-each select="ns0:Main/RECORDSET/Item">
<Item>
<xsl:for-each select="Number">
<Number>
<xsl:value-of select="."/>
</Number>
</xsl:for-each>
<xsl:for-each select="rowNumber">
<rowNumber>
<xsl:value-of select="."/>
</rowNumber>
</xsl:for-each>
<xsl:for-each select="Product">
<Product>
<xsl:value-of select="."/>
</Product>
</xsl:for-each>
<xsl:variable name="KeyNumber" select="Number"/>
<xsl:variable name="KeyrowNumber" select="rowNumber"/>
<xsl:for-each select="ns0:Main/RECORDSET/Tax[ Number = $KeyNumber and
taxRowNumber = $KeyrowNumber ]">
<Tax>
<xsl:copy-of select="./*"/>
</Tax>
</xsl:for-each>
</Item>
</xsl:for-each>
</RECORDSET>
</ns0:Main>
</xsl:template>
</xsl:transform>
非常感谢您的帮助。
解决方案
我建议您使用密钥来检索匹配的Tax
节点。尝试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="tax" match="Tax" use="concat(Number, '|', taxRowNumber)" />
<xsl:template match="/*">
<xsl:copy>
<RECORDSET>
<xsl:for-each select="RECORDSET/Item">
<xsl:copy>
<xsl:copy-of select="*"/>
<xsl:copy-of select="key('tax', concat(Number, '|', rowNumber))"/>
</xsl:copy>
</xsl:for-each>
</RECORDSET>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- angular - 如何更改 Angular Material 中的标签标签?
- kubernetes - Helm Secrets 无法识别数据
- c# - 在 JetBrains Rider 中查找未使用的公共方法
- vue.js - Vue-CLI 不监视子文件夹中的文件
- spring - 如何从 Spring MVC 的选择组件中完全获取对象?
- r - 如何将多个条件与逻辑运算符组合用于布尔向量或 if 语句
- dotvvm - DotVVM 静态命令绑定 - 对 viewmodel 属性的间接引用
- sql - 仅选择数值,否则返回 NULL
- laravel - 如何在 Laravel 审计表中审计新的自定义数据?
- angular - Angular @Input 从索引 html 传递数据