2012-04-26 64 views
1

内前述节点给出的以下XML如何选择特定父

<Root> 
<Employee> 
    <service> 
    <Record>xxx</Record> 
    <Record>yyy</Record> 
    </service> 
    <service> 
    <Record>xxx</Record> 
    <Record>yyy</Record> 
    <Record>zzz</Record> 
    </service> 
</Employee> 
<Employee> 
    <service> 
    <Record>xxx</Record> 
    <Record>yyy</Record> 
    </service> 
    <service> 
    <Record>xxx</Record> 
    <Record>yyy</Record> 
    <Record>zzz</Record> 
    </service> 
</Employee> 
</Root> 

使用XSLT1.0,而转换XML每个<Employee>含“XXX” <Record>字段,“YYY”,“ZZZ”使用<xsl:if test='not(preceding::./service/Record=$record)'>的结果应该只出现一次

<Root> 
<Employee> 
    <Service> 
    <Record>xxx</Record> 
    <Record>yyy</Record> 
    <Record>zzz</Record> 
    </Service> 
</Employee> 
<Employee> 
    <Service> 
    <Record>xxx</Record> 
    <Record>yyy</Record> 
    <Record>zzz</Record> 
<Service> 
</Employee> 
</Root> 

在for-each循环员工我的累。该测试适用于第一个<Employee>,其中<Record>仅用于'xxx','yyy','zzz'一次。当迭代进行到下一个<Employee>时,测试条件也会检查第一个<Employee>中的<Record>值,并且它发现前面的节点已经存在xxxx','yyy','zzz'值,因此我无法获得第二个记录为<Employee>。 如何在第二个<Employee>中获得<Record> s。任何帮助深表感谢。

由于

回答

0

这种变换使用用于分组的Muenchian方法:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kEmpRecordByVal" match="Employee/service/Record" 
    use="concat(generate-id(../..), '+', .)"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Employee"> 
    <Employee> 
    <xsl:apply-templates select= 
    "service/Record 
      [generate-id() 
      = 
      generate-id(key('kEmpRecordByVal', 
          concat(generate-id(../..), '+', .) 
          )[1] 
         ) 
      ] 
    "/> 
    </Employee> 
</xsl:template> 
</xsl:stylesheet> 

当在下面的XML文档(所提供的一个不同的值用于第二Employee以帮助可读性施加):

<Root> 
    <Employee> 
     <service> 
      <Record>xxx</Record> 
      <Record>yyy</Record> 
     </service> 
     <service> 
      <Record>xxx</Record> 
      <Record>yyy</Record> 
      <Record>zzz</Record> 
     </service> 
    </Employee> 
    <Employee> 
     <service> 
      <Record>aaa</Record> 
      <Record>bbb</Record> 
     </service> 
     <service> 
      <Record>aaa</Record> 
      <Record>bbb</Record> 
      <Record>ccc</Record> 
     </service> 
    </Employee> 
</Root> 

通缉,正确结果产生:

<Root> 
    <Employee> 
     <Record>xxx</Record> 
     <Record>yyy</Record> 
     <Record>zzz</Record> 
    </Employee> 
    <Employee> 
     <Record>aaa</Record> 
     <Record>bbb</Record> 
     <Record>ccc</Record> 
    </Employee> 
</Root>