我正在尝试在应用过滤器时在调用模板中进行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>
答案 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))