2010-10-04 54 views
2

我有这样一个XML文件:如何获取XSLT中所有相同元素的值?

<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这样的子项目,我也想要每一个不同的项目ID。
  2. 此外,我想要在多个位置为我提供此列表。解析项目A1时,或解析A11或任何其他嵌套级别的proj时。

有什么办法在XSLT中实现这一点?

谢谢。
Tara Singh

+0

@ Tara-Singh:好问题(+1)。查看我的答案,了解两种不同的完整和简短的XSLT 1.0解决方案。 :) – 2010-10-04 02:26:25

回答

2
  1. 我想拥有所有项目的列表。即使它们在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(.,'&#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> 

当施加这种转变在下面的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组。

+0

+1很好的答案和解释。 – 2010-10-04 15:26:22

1

是的,这是可能的。

以下XPath表达式将选择文档中的所有元素proj

//proj 
相关问题