我想拥有所有项目的列表。即使它们在A1中也像A111这样的项目,我想要 每个不同的项目ID。另外,我希望在多个位置可以使用这个列表, Ex。解析项目A1时,或者当解析A11或任何其他嵌套级别 proj时 。
有没有什么办法在 XSLT中实现这一点?
您尚未指定是否可能有多个<proj>
元素的子元素值为<id>
。
下面是一个XSLT溶液,它定义两个全局变量,一个XML文档中的所有<id>
元素的节点集,其他 - 节点集<id>
元件的每一个具有一个值,该值是不同于其余的值,并且所有<id>
的值被呈现。
由于这些变量是global变量,它们可以在XSLT代码的任何位置访问,即使在导入/包含或导入/包括样式表中也是如此。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kIdByVal" match="id" use="."/>
<xsl:variable name="vallProjIds" select="//proj/id"/>
<xsl:variable name="vdistinctProjIds" select=
"//proj/id[generate-id()
=
generate-id(key('kIdByVal', .)[1])
]
"/>
<xsl:template match="/">
All Project IDs:
<xsl:for-each select="$vallProjIds">
<xsl:value-of select="concat(.,'
')"/>
</xsl:for-each>
All Distinct Project IDs:
<xsl:for-each select="$vdistinctProjIds">
<xsl:value-of select="concat(.,'
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当施加这种转变在下面的XML文档(基于所提供的一个,但由公形成并延伸以覆盖更多的情况下):
<company>
<dept>
<name> Dept-A</name>
<proj>
<id> A1 </id>
<noOfPeople> 5 </noOfPeople>
<proj>
<id>A11</id>
<noOfPeople> 2 </noOfPeople>
</proj>
</proj>
</dept>
<dept>
<name> Dept-B</name>
<proj>
<id> A1 </id>
<noOfPeople> 5 </noOfPeople>
</proj>
<proj>
<id> B1 </id>
<noOfPeople> 5 </noOfPeople>
<proj>
<id>B11</id>
<noOfPeople> 2 </noOfPeople>
</proj>
</proj>
</dept>
</company>
有用,正确的结果产生:
All Project IDs:
A1
A11
A1
B1
B11
All Distinct Project IDs:
A1
A11
B1
B11
待办事项该解决方案使用Muenchian方法进行分组,以获得具有唯一值的Id
组。
@ Tara-Singh:好问题(+1)。查看我的答案,了解两种不同的完整和简短的XSLT 1.0解决方案。 :) – 2010-10-04 02:26:25