在XSLT中选择第一个和第二个节点

时间:2011-03-20 01:17:26

标签: xslt

给定以下结构,如何根据XSLT中的谓词从文档中复制第一个和第二个节点及其所有元素:

<list>
  <slot>xx</slot>
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data>      
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data> 
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data> 
</list> 
<list>
  <slot>xx</slot>
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data> 
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data> 
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data> 
</list> 

如何从列表中选择第一次和第二次出现的数据(没有数据元素本身,只有名称,年龄),其中插槽等于不同的变量,即第一个列表具有{{1} },但我需要第二个列表中的数据,slot=02。但是,只要slot=01

,插槽的顺序并不重要

我尝试了以下声明,但它没有产生任何结果:

slot=$slotvariable

任何有效的建议都将受到赞赏

2 个答案:

答案 0 :(得分:5)

如果我理解你的问题,那么:

<Lastdata>
  <xsl:copy-of select="list[slot=$slotvariable]/data[1]/*" />
</Lastdata>
<prevdata>
  <xsl:copy-of select="list[slot=$slotvariable]/data[2]/*" />
<prevdata>

提示:

  • 除非您有基于表达式的动态名称,否则不要使用<xsl:element>
  • [1][position() = 1]
  • 的简写

答案 1 :(得分:0)

以下样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="slot" select="'slot1'"/>
    <xsl:template match="/lists/list">
        <xsl:copy-of select="data[../slot=$slot][position()&lt;3]/*"/>
    </xsl:template>
</xsl:stylesheet>

适用于此来源:

<lists>
    <list>
      <slot>slot1</slot>
       <data>
           <name>George</name>
           <age>7</age>  
       </data> 
       <data>
           <name>Bob</name>
           <age>22</age>  
       </data> 
       <data>
           <name>James</name>
           <age>77</age>  
       </data> 
    </list> 
    <list>
      <slot>slot2</slot>
       <data>
           <name>Wendy</name>
           <age>25</age>  
       </data> 
    </list> 
</lists>

产生以下结果:

<name>George</name>
<age>7</age>
<name>Bob</name>
<age>22</age>
相关问题