Xslt for-each和key match

时间:2010-10-07 13:31:42

标签: xslt

我有两个这样的xml数据源:

<orders>
 <order>
  <ordernumber>123</ordernumber>
  <subtotal>20</subtotal>
  <total>23.5</total>
 </order>
  <order>
  <ordernumber>234</ordernumber>
  <subtotal>19</subtotal>
  <total>26.5</total>
 </order>
</orders>

<orderitems>
 <item>
  <ordernumber>123</ordernumber>
  <productname>test1</productname>
  <sku>s9sdidk</sku>
 <item>
 <item>
  <ordernumber>123</ordernumber>
  <productname>test2</productname>
  <sku>123232</sku>
 <item>
 <item>
  <ordernumber>234</ordernumber>
  <productname>test3</productname>
  <sku>s9sd2d32k</sku>
 <item>
 <item>
  <ordernumber>234</ordernumber>
  <productname>test4</productname>
  <sku>s9swe23</sku>
 <item>
</orderitems>

然后我需要使用xslt按订单号对项目进行分组并得到如下输出:

productname               sku
test1                     s9sdidk
test2                     123232
---------------------------------
   subtotal: 20
   total: 23.5

productname               sku
test3                     s9sd2d32k
test4                     s9swe23
---------------------------------
   subtotal: 19
   total: 26.5

我需要使用html标签,所以我不能使用for-each-groups的东西......请帮忙! 提前谢谢。

2 个答案:

答案 0 :(得分:0)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:key name="kItemByOrdernumber" match="item" use="ordernumber"/>
    <xsl:variable name="vSource2" select="document('source2.xml')"/>
    <xsl:template match="text()"/>
    <xsl:template match="order/ordernumber">
        <xsl:variable name="vCurrent" select="."/>
        <xsl:text>productname&#x9;&#x9;sku&#xA;</xsl:text>
        <xsl:for-each select="$vSource2">
            <xsl:apply-templates
                     select="key('kItemByOrdernumber',$vCurrent)"/>
        </xsl:for-each>
        <xsl:value-of 
             select="concat('---------------------------------','&#xA;',
                            '&#x9;subtotal: ',../subtotal,'&#xA;',
                            '&#x9;total: ',../total,'&#xA;&#xA;')"/>
    </xsl:template>
    <xsl:template match="item">
        <xsl:value-of select="concat(productname,'&#x9;&#x9;&#x9;',
                                     sku,'&#xA;')"/>
    </xsl:template>
</xsl:stylesheet>

将第一个文档作为输入,将第二个文档作为source2.xml外部输入,输出:

productname     sku
test1           s9sdidk
test2           123232
---------------------------------
    subtotal: 20
    total: 23.5

productname     sku
test3           s9sd2d32k
test4           s9swe23
---------------------------------
    subtotal: 19
    total: 26.5

答案 1 :(得分:0)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:key name="kitemByOrder" match="item" use="ordernumber"/>

 <xsl:param name="pmaxSize" select="100"/>

 <xsl:template match="*">
  <xsl:apply-templates />
 </xsl:template>

 <xsl:template match="order">
productname<xsl:text>&#9;</xsl:text>sku
<xsl:apply-templates select="key('kitemByOrder', ordernumber)"/>
 ---------------------------------
   subtotal: <xsl:value-of select="subtotal"/>
   total: <xsl:value-of select="total"/>
   <xsl:text>&#xA;&#xA;</xsl:text>
 </xsl:template>

 <xsl:template match="item">
  <xsl:value-of select="concat(productname, '&#9;&#9;', sku, '&#xA;')"/>
 </xsl:template>

 <xsl:template match="orderitems"/>
</xsl:stylesheet>

应用于提供的XML文档(因严重不正确而更正):

<t>
    <orders>
        <order>
            <ordernumber>123</ordernumber>
            <subtotal>20</subtotal>
            <total>23.5</total>
        </order>
        <order>
            <ordernumber>234</ordernumber>
            <subtotal>19</subtotal>
            <total>26.5</total>
        </order>
    </orders>
    <orderitems>
        <item>
            <ordernumber>123</ordernumber>
            <productname>test1</productname>
            <sku>s9sdidk</sku>
        </item>
        <item>
            <ordernumber>123</ordernumber>
            <productname>test2</productname>
            <sku>123232</sku>
        </item>
        <item>
            <ordernumber>234</ordernumber>
            <productname>test3</productname>
            <sku>s9sd2d32k</sku>
        </item>
        <item>
            <ordernumber>234</ordernumber>
            <productname>test4</productname>
            <sku>s9swe23</sku>
        </item>
    </orderitems>
</t>

生成想要的正确结果

productname sku
test1       s9sdidk
test2       123232

 ---------------------------------
   subtotal: 20
   total: 23.5


productname sku
test3       s9sd2d32k
test4       s9swe23

 ---------------------------------
   subtotal: 19
   total: 26.5

注意:您可以为两个数据源使用两个不同的XML文档,但处理基本相同,但您需要使用{{1}来解决其中一个问题。功能。