XSLT 分组 - 从一种 XML 格式转换为另一种格式
本文关键字:格式 XML 一种 转换 另一种 分组 XSLT | 更新日期: 2023-09-27 18:32:38
我有一个xslt,用于从一种xml格式转换为另一种xl格式。
我的源文件有多个"生产订单"和一个"销售订单"我的目的地只有一个包含所有生产订单的"销售订单"。
这是我的源 xml 格式
<GenomicOrder>
<SalesOrder>
....
</SalesOrder>
<ProductionOrder>
....
</ProductionOrder>
<ProductionOrder>
....
</ProductionOrder>
<ProductionOrder>
....
</ProductionOrder>
</GenomicOrder>
我的目标 XML 格式如下
<GenomicOrder>
<SalesOrder>
....
<ProductionOrder>
....
</ProductionOrder>
<ProductionOrder>
....
</ProductionOrder>
<ProductionOrder>
....
</ProductionOrder>
</SalesOrder>
</GenomicOrder>
我的反序列化代码如下
DataContractSerializer ser = new DataContractSerializer(typeof(SalesOrder));
FileStream fs =
new FileStream(
@"C:'realsample.xml",
FileMode.Open);
XmlDictionaryReader reader1 = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
//Deserialize the data and read it from the instance.
SalesOrder parent = (SalesOrder)ser.ReadObject(reader1, true);
reader1.Close();
我成功的销售订单 xslt 转换如下
<xsl:template match="/">
<SalesOrder>
<xsl:apply-templates select="GenomicOrder/SalesOrder"/>
<ProductionOrders>
<xsl:apply-templates select="GenomicOrder/ProductionOrder"/>
</ProductionOrders>
</SalesOrder>
</xsl:template>
SalesOrder.OrderId=1234;销售订单.生产订单 =空;
我成功的生产订单 xslt 转换如下
<xsl:template match="/">
<SalesOrder>
<ProductionOrders>
<xsl:apply-templates select="GenomicOrder/ProductionOrder"/>
</ProductionOrders>
<xsl:apply-templates select="GenomicOrder/SalesOrder"/>
</SalesOrder>
</xsl:template>
SalesOrder.OrderId=null;SalesOrder.ProductionOrder.OrderRef = 12345;
我可以做任何更改来一次性反序列化所有对象。我为"GenomicOrder/ProductionOrder"和"GenomicOrder/SalesOrder"编写了转换。
我不确定我是否理解这个问题,假设您想将所有元素包装在SalesOrder
元素之后,您可以使用如下方法
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="GenomicOrder">
<xsl:copy>
<xsl:for-each-group select="*" group-starting-with="SalesOrder">
<SalesOrder>
<xsl:copy-of select="node(), current-group() except ."/>
</SalesOrder>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XSLT 2.0 样式表,当在输入上使用 Saxon 9.4 运行时
<GenomicOrder>
<SalesOrder>
....
</SalesOrder>
<ProductionOrder>
....
</ProductionOrder>
<ProductionOrder>
....
</ProductionOrder>
<ProductionOrder>
....
</ProductionOrder>
</GenomicOrder>
输出
<GenomicOrder>
<SalesOrder>
....
<ProductionOrder>
....
</ProductionOrder>
<ProductionOrder>
....
</ProductionOrder>
<ProductionOrder>
....
</ProductionOrder>
</SalesOrder>
</GenomicOrder>
如果我的建议没有帮助,您可能需要发布有关 XML 输入结构的更多详细信息。