如何在XSLT中获取相同元素的所有出现的值?

时间:2010-10-04 01:38:01

标签: xslt

我有一个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>

现在:

  1. 我想要列出所有项目。即使它们是A1中的A11之类的子项目,我也想要每个不同的项目。
  2. 另外,我想在多个地点提供此列表,例如。在解析项目A1时,或在解析A11或任何其他嵌套级别的项目时。
  3. 有没有办法在XSLT中实现这个目标?

    谢谢。
    塔拉辛格

2 个答案:

答案 0 :(得分:2)

  
      
  1. 我想要列出所有项目。即使他们是Sub   A1中的A11项目,我想要   每个不同的项目。

  2.   
  3. 另外,我想在多个地点向我提供此列表,   防爆。在解析项目A1时,或者同时解析项目A1   解析A11或任何其他嵌套级别   项目

  4.         

    有没有办法实现这一目标   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(.,'&#xA;')"/>
  </xsl:for-each>
  All Distinct Project IDs:
  <xsl:for-each select="$vdistinctProjIds">
    <xsl:value-of select="concat(.,'&#xA;')"/>
  </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