跟随兄弟节点与当前xslt / xpath

时间:2012-12-27 00:06:08

标签: html css xml xslt xpath

我需要选择所有奇数位置元素并将它们放在左浮动div和右浮动div中的所有偶数元素中:

<rows>
  <row title="A" />
  <row title="B" />
  <row title="C" />
  <row title="D" />
  <row title="E" />
  <row title="F" />
</rows>

==================转换为===&gt;

A-----B
C-----D
E-----F

我正在使用以下xsl:

    <div class="content-left" style="width:250px; float:left;"> 
    <span class="NewsHeading">
    <h4><xsl:value-of select="@Title"/></h4>
    </span> 
    </div> 
    <div class="content-right" style="float:right"> 
    <span class="NewsHeading">
    <h4><xsl:value-of select="following-sibling::*[1]/@Title"/></h4>
    </span> 
</div>

但我的XSLT产生以下内容:

A----B
B----C
C----D
D----E
E----F

如何使第二行从第一行的兄弟后面的兄弟姐妹开始?

听起来有点奇怪......基本上我只是不想重复......

2 个答案:

答案 0 :(得分:1)

你可能在某个地方有一个'xsl:for-each select =“rows / row”'元素?

然后只需用

替换它
<xsl:for-each select="rows/row[position() mod 2 = 1]">

仅将模板应用于每个第二行

答案 1 :(得分:1)

以下是完整的解决方案:

<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:template match="/*">
     <div class="content-carousel">
     <ul class="bjqs">
      <xsl:apply-templates select="*[position() mod 2 =1]"/>
     </ul>
   </div>
 </xsl:template>

 <xsl:template match="row">
   <li>
     <div class="content-left">
        <h4><xsl:value-of select="@title"/></h4>
     </div>
       <div class="content-right">
         <h4><xsl:value-of select="following-sibling::*[1]/@title"/></h4>
       </div>
  </li>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档时:

<rows>
  <row title="A" />
  <row title="B" />
  <row title="C" />
  <row title="D" />
  <row title="E" />
  <row title="F" />
</rows>

产生了想要的正确结果:

<div class="content-carousel">
   <ul class="bjqs">
      <li>
         <div class="content-left">
            <h4>A</h4>
         </div>
         <div class="content-right">
            <h4>B</h4>
         </div>
      </li>
      <li>
         <div class="content-left">
            <h4>C</h4>
         </div>
         <div class="content-right">
            <h4>D</h4>
         </div>
      </li>
      <li>
         <div class="content-left">
            <h4>E</h4>
         </div>
         <div class="content-right">
            <h4>F</h4>
         </div>
      </li>
   </ul>
</div>