[英]Need to create XML based on another XML using XSLT2.0 based on distinct attributes and group by
[英]Group XML Elements based on element values and attributes using XSLT 2.0
我想遍历XML elemets,将这些XML elemet按通用元素值分组。 输入的XML结构为:
<?xml version="1.0" encoding="utf-8"?>
<Data>
<output outputType="CORRECTION">
<row nodeName="ORDER_HEADER" tableName="ORDER_HEADER">
<column columnName="ORDER_NUMBER">00001</column>
<column columnName="Country">England</column>
<column columnName="City">London</column>
</row>
<row nodeName="ORDER_HEADER" tableName="ORDER_HEADER">
<column columnName="ORDER_NUMBER">00002</column>
<column columnName="Country">England</column>
<column columnName="City">Birmingham</column>
</row>
<row nodeName="ORDER_DETAIL" tableName="ORDER_DETAIL">
<column columnName="ORDER_NUMBER">00001</column>
<column columnName="Book">Gone with the wind</column>
<column columnName="Qty">2</column>
</row>
<row nodeName="ORDER_DETAIL" tableName="ORDER_DETAIL">
<column columnName="ORDER_NUMBER">00001</column>
<column columnName="Book">Pride and Prejudice</column>
<column columnName="Qty">3</column>
</row>
<row nodeName="ORDER_DETAIL" tableName="ORDER_DETAIL">
<column columnName="ORDER_NUMBER">00002</column>
<column columnName="Book">Jane Eyre</column>
<column columnName="Qty">1</column>
</row>
</output>
</Data>
我正在尝试创建以下输出:
<Transmission xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.w3.org/1999/xhtml">
<OrderNumber>00001</OrderNumber>
<Country>England</Country>
<City>London</CITY>
<Book>Gone with the wind</Book>
<QTY>2</QTY>
<Book>Pride and Prejudice</Book>
<QTY>3</QTY>
<OrderNumber>00002</OrderNumber>
<Country>England</Country>
<City>Birmingham</CITY>
<Book>Jane Eyre</Book>
<QTY>1</QTY>
</Transmission>
这是我到目前为止拥有的XSL:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/Data/output[@outputType='CORRECTION']">
<Transmission>
<xsl:for-each select="row[@tableName='ORDER_HEADER']">
<OrderNumber>
<xsl:value-of select="column[@columnName='ORDER_NUMBER']" />
</OrderNumber>
<Country>
<xsl:value-of select="column[@columnName='Country']" />
</Country>
<City>
<xsl:value-of select="column[@columnName='City']" />
</City>
</xsl:for-each>
</Transmission>
</xsl:template>
</xsl:stylesheet>
我可以从每个订单标题输出详细信息,但看不到如何选择和分组正确的订单详细信息。 任何帮助将非常感激。
谢谢
您可以使用键来查询订单详细信息(在XSLT 1.0和XSLT 2.0中均适用)
<xsl:key name="detail" match="row[@nodeName='ORDER_DETAIL']" use="column[@columnName='ORDER_NUMBER']" />
然后,要获取给定订单号的订单详细信息,可以使用如下键:
<xsl:for-each select="key('detail', column[@columnName='ORDER_NUMBER'])">
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="detail" match="row[@nodeName='ORDER_DETAIL']" use="column[@columnName='ORDER_NUMBER']" />
<xsl:template match="/Data/output[@outputType='CORRECTION']">
<Transmission>
<xsl:for-each select="row[@tableName='ORDER_HEADER']">
<xsl:variable name="orderNumber" select="column[@columnName='ORDER_NUMBER']" />
<OrderNumber>
<xsl:value-of select="$orderNumber" />
</OrderNumber>
<Country>
<xsl:value-of select="column[@columnName='Country']" />
</Country>
<City>
<xsl:value-of select="column[@columnName='City']" />
</City>
<xsl:apply-templates select="key('detail', $orderNumber)" />
</xsl:for-each>
</Transmission>
</xsl:template>
<xsl:template match="row">
<Book>
<xsl:value-of select="column[@columnName='Book']" />
</Book>
<QTY>
<xsl:value-of select="column[@columnName='Qty']" />
</QTY>
</xsl:template>
</xsl:stylesheet>
注意,我改用xsl:apply-templates
,只是为了减少过多的嵌套代码。 我还使用了一个变量,以避免重复获取订单号。
顺便说一句,这真的是您想要的XML输出吗? 像这样将每个订单包装在一个包含父元素中可能更合乎逻辑,否则为订单提取书本将变得更加艰巨。
<Transmission>
<Order>
<OrderNumber>00001</OrderNumber>
<Country>England</Country>
<City>London</City>
<Book>Gone with the wind</Book>
<QTY>2</QTY>
<Book>Pride and Prejudice</Book>
<QTY>3</QTY>
</Order>
<Order>
<OrderNumber>00002</OrderNumber>
<Country>England</Country>
<City>Birmingham</City>
<Book>Jane Eyre</Book>
<QTY>1</QTY>
</Order>
</Transmission>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.