XSLT分组与过滤器

时间:2014-08-11 01:55:37

标签: xslt

我正在尝试在应用过滤器时在调用模板中进行XSLT分组。下面的代码工作正常但它不考虑过滤条件并返回所有节点。请帮我理解我做错了什么。我的理解是,它与下一行的范围有关

<xsl:for-each select="key('ParentName',@ParentName)" >

这是xml和xslt。

<?xml version="1.0" encoding="utf-16"?>
<Documentation>
  <Consequences>
    <Nodes>
      <Node1 name ="abc1"  ParentName="Group1" IsInternal ="true" />
      <Node1 name ="abc2" ParentName="Group2" IsInternal ="true"/>
      <Node1 name ="bcd1"  ParentName="Group2" IsInternal ="true" />
      <Node1 name ="bcd2" ParentName="Group1" IsInternal ="false"/>
      <Node1 name ="efg1"  ParentName="Group2" IsInternal ="false"/>
      <Node1 name ="efg2" ParentName="Group1" IsInternal ="false" />
    </Nodes>
  </Consequences>
    </Documentation>

XSLT: -

  <xsl:output method="xml" indent="yes"/>

      <xsl:template match="Consequences" >        
                      <xsl:call-template name="Template1">
                         <xsl:with-param name="NodeList" select="Nodes/Node1[@IsInternal='true']"/>    
                      </xsl:call-template>

      </xsl:template>

        <xsl:key name="ParentName" match="Node1" use="@ParentName" />

       <xsl:template  name ="Template1">  
         <xsl:param name="NodeList" />


          <xsl:for-each select="$NodeList[generate-id()=generate-id(key('ParentName',@ParentName)[1])]">
            <Group>
              <xsl:value-of select="@ParentName" />

             <xsl:for-each select="key('ParentName',@ParentName)" >
               <SubItems>
                  <xsl:value-of select="@name" />
               </SubItems>
             </xsl:for-each>
           </Group>
          </xsl:for-each>  

      </xsl:template>

1 个答案:

答案 0 :(得分:0)

假设您尝试仅选择@IsInternal='true'的元素,而不是仅选择具有指定Node1的所有@ParenName元素。

您的xsl:key与所有Node1元素匹配,并由@ParentName值编入索引。如果您只使用该密钥检索@IsInternal='true'的元素,则可以在匹配条件中添加谓词过滤器:

<xsl:key name="ParentName" match="Node1[@IsInternal='true']" use="@ParentName" />

如果您需要使用该密钥在其他区域按Node1查找@ParentName元素,而不考虑@IsInternal值是什么,那么您可以过滤从密钥返回的项目查找:

<xsl:for-each select="key('ParentName',@ParentName)[@IsInternal='true']" >
    <SubItems>
        <xsl:value-of select="@name" />
    </SubItems>   
</xsl:for-each>

您还可以定义一个使用@ParentName@IsInternal值的值作为键值的键:

<xsl:key name="ParentName" match="Node1" 
         use="concat(@ParentName,'-',@IsInternal)" />

然后使用相同的键值检索它们:

key('ParentName',concat(@ParentName,'-',@IsInternal))