2

鉴于此 XML,我需要显示单个类别中的项目,并在组标题下分组。不应显示空组(例如,当类别等于 x 时,不应显示组 C 的标题,类别 z 和组 A 和 B 相同)。

<group name="A">
  <item name="A1" category="x"/>
  <item name="A2" category="x"/>
  <item name="A3" category="y"/>
</group>
<group name="B">
  <item name="B1" category="x"/>
</group>
<group name="C">
  <item name="C1" category="y"/>
  <item name="C2" category="z"/>
</group>

因为我无法显示空组,所以我已经将项目过滤到 $items 中。我将此集合作为参数传递给呈现分组的模板(见下文)。在这个模板中,对于每个分组,我需要调用一个模板来呈现当前组中的项目。

<xsl:template name="groups">

  <!-- This is already filtered by category -->
  <xsl:param name="items" />

  <!-- Select only the groups that should be displayed -->
  <xsl:for-each select="$items/parent::group">
    <h1><xsl:value-of select="./@name"/></h1>

    <!-- Display all filtered items in this group -->
    <div class="items">
      <xsl:call-template name="items">
        <!-- How can I get the items from $items for the current group? -->
        <xsl:with-param name="partners" select="$items..."/>
      </xsl:call-template>
    </div>

  </xsl:for-each>
</xsl:template>

我为param传递给items模板的内容选择什么?

显示所有项目的模板:

<xsl:template name="items">
  <xsl:param name="items" />

  <xsl:for-each select=".">
    <div class="item">
      <xsl:value-of select="./@name" />
    </div>
  </xsl:for-each>
</xsl:template>

过滤类别 z 后的最终结果应该是:

<h1>C</h1>
<div class="items">
  <div class="item">C2</div>
</div>
4

1 回答 1

0

此转换为所有类别产生所需的结果:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kCatByVal" match="@category" use="."/>
 <xsl:key name="kGroupByCat" match="group" use="item/@category"/>
 <xsl:key name="kItemByGroupAndCat" match="item"
  use=" concat(generate-id(..), '+', @category)"/>

 <xsl:variable name="vDistCats" select=
  "/*/*/*/@category
            [generate-id() = generate-id(key('kCatByVal', .)[1])]"/>

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

 <xsl:template match="@category">
 <h1>Category <xsl:value-of select="."/></h1>
  <xsl:apply-templates select="key('kGroupByCat', .)">
   <xsl:with-param name="pCat" select="."/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="group">
  <xsl:param name="pCat"/>
  <h1><xsl:value-of select="@name"/></h1>
  <div class="items">
   <xsl:apply-templates select=
    "item
      [generate-id()
      =
       generate-id(key('kItemByGroupAndCat',
                        concat(generate-id(..), '+', $pCat)
                        )
                    )]"/>
  </div>
 </xsl:template>

 <xsl:template match="item">
  <div class="item"><xsl:value-of select="@name"/></div>
 </xsl:template>
</xsl:stylesheet>

当应用于提供的 XML 文档时(已纠正所有严重的格式错误):

<t>
    <group name="A">
        <item name="A1" category="x"/>
        <item name="A2" category="x"/>
        <item name="A3" category="y"/>
    </group>
    <group name="B">
        <item name="B1" category="x"/>
    </group>
    <group name="C">
        <item name="C1" category="y"/>
        <item name="C2" category="z"/>
    </group>
</t>

产生了想要的正确结果

<h1>Category x</h1>
<h1>A</h1>
<div class="items">
   <div class="item">A1</div>
</div>
<h1>B</h1>
<div class="items">
   <div class="item">B1</div>
</div>
<h1>Category y</h1>
<h1>A</h1>
<div class="items">
   <div class="item">A3</div>
</div>
<h1>C</h1>
<div class="items">
   <div class="item">C1</div>
</div>
<h1>Category z</h1>
<h1>C</h1>
<div class="items">
   <div class="item">C2</div>
</div>

这在浏览器中显示为

类别 x

一种

A1

B1

类别 y

一种

A3

C

C1

类别 z

C

C2
于 2012-07-27T12:44:14.577 回答