XSLT分组继续 - xPath问题?

时间:2010-08-17 21:02:52

标签: xml xslt xpath xslt-grouping

Dimitre早些时候是一个很大的帮助...这有点像第二部分。 :)

我一直在震撼我的大脑,但仍然没有看到它。

既然我已经能够隔离下面xml示例的Brands,现在我想要隔离给定$ Brand的所有Product-Type,就像我能够隔离所有品牌一样

xml示例(许多产品的一个成员)......

<Product>
        <Brand>Brand</Brand>
        <Type>Product Type (Category)</Type>
        ...
    </Product>

这是我能够提出的xsl。我认为我的错误在xsl:key ...

的xPath表达式中
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="Brand" select="Brand"/> 
  <xsl:output method="html" encoding="utf-8"/>
    <xsl:key name="kProdByType" 
          match="Products/Product/Brand[. = $Brand]" use="../Type"/>

  <xsl:template match="Products">
    <xsl:for-each 
          select="Product[generate-id() = 
          generate-id(key('kProdByType', Type)[1])]
         "><xsl:sort select="Type" /><xsl:value-of 
            select="Type" />|</xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

再次感谢!

1 个答案:

答案 0 :(得分:1)

现在您按BrandType进行分组。关键必须是:

<xsl:key name="kProdByBrandAndType" 
         match="Product" use="concat(Brand,'+++',Type)"/> 

现在,分组:

<xsl:for-each  
          select="Product[generate-id() =  
                          generate-id(key('kProdByBrandAndType',
                                          concat($Brand,'+++',Type))[1])]">

在模式中使用变量/参数应该是错误的,但我认为至少MSXSL不会在密钥中抱怨它。 为安全起见,请勿使用

<xsl:key name="kProdByType" match="Product[Brand=$Brand]" use="Type"/>