我有一个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>
....
</dept>
</company>
现在:
有没有办法在XSLT中实现这个目标?
谢谢。
塔拉辛格
答案 0 :(得分:2)
我想要列出所有项目。即使他们是Sub A1中的A11项目,我想要 每个不同的项目。
- 醇>
另外,我想在多个地点向我提供此列表, 防爆。在解析项目A1时,或者同时解析项目A1 解析A11或任何其他嵌套级别 项目
有没有办法实现这一目标 XSLT?
您尚未指定是否可以将多个<proj>
元素与其子<id>
的值相同。
这是一个定义两个全局变量的XSLT解决方案,一个是XML文档中所有<id>
元素的节点集,另一个是{{的节点集1}}元素,每个元素的值都与其余值不同,并且<id>
的所有值都是。
由于这些是全局变量,因此可以在XSLT代码的任何位置访问它们,即使在导入/包含或导入/包含样式表中也是如此。
<id>
将此转换应用于以下XML文档(基于提供的转换,但是格式良好并扩展以涵盖更多案例):
<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>
产生了想要的正确结果:
<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>
请注意此解决方案使用Muenchian方法进行分组,以获取具有唯一值的 All Project IDs:
A1
A11
A1
B1
B11
All Distinct Project IDs:
A1
A11
B1
B11
s集。
答案 1 :(得分:1)
是的,这是可能的。
以下XPath表达式将选择文档中的所有proj
元素:
//proj