xslt每隔三个div改变一次

时间:2012-07-04 21:39:35

标签: xslt

我对Xslt mod有疑问。我需要将每个第3个div的div类从“clmn-3 doublespace”更改为“clmn-3”。尝试了几个提示,但无法理解在哪里添加参数。

    <div class="clmn-9 products">
    <h1>Title</h1>
    <xsl:if test="$mode = 'edit'">
    <xsl:text disable-output-escaping="yes"><![CDATA[<div class="webtop">]]></xsl:text>
    </xsl:if>
    <xsl:call-template name="ndSitePageList">
    <xsl:with-param name="sPgLstID" select="1" />
    <xsl:with-param name="customTemplate">
    <xsl:for-each select="/ndTemplate/ndSitePageLists/ndList[instanceID=1]/ndSitePage">
    <xsl:call-template name="ndReplaceListSitePageElements">
    <xsl:with-param name="template">
    <xsl:text disable-output-escaping="yes">
    <![CDATA[
    <div class="clmn-3 doublespace"> 
    <a href="]]></xsl:text><xsl:value-of select="link"/><xsl:text disable-output-escaping="no">  <![CDATA["><img src="]]></xsl:text><xsl:value-of select="/ndTemplate/ndSpgPath"/><xsl:value-of select="srcThumb"/><xsl:text disable-output-escaping="no"><![CDATA["alt="" /></a>
    <div class="clmn-3 shadow"></div>
    <h2>]]></xsl:text><xsl:value-of select="title"/><xsl:text disable-output-escaping="no"><![CDATA[</h2>
    <span class="text">]]></xsl:text><xsl:value-of select="description"/><xsl:text disable-output-escaping="no"><![CDATA[</span>
    </div>
    ]]>
    </xsl:text>
    </xsl:with-param>
    </xsl:call-template>
    </xsl:for-each>
    </xsl:with-param>
    </xsl:call-template>
    </div>

提前谢谢你 亚历

1 个答案:

答案 0 :(得分:1)

<强>予。以下是如何在XSLT 1.0中指定此类处理的示例:

<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:param name="pNewValue" select="'someNewAttribValue'"/>

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

 <xsl:template match="num[position() mod 3 = 1]">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:attribute name="class"><xsl:value-of select="$pNewValue"/></xsl:attribute>
    <xsl:apply-templates select="node()"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下XML文档时(问题中未提供任何内容!):

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

需要的正确结果(每三个num元素都有一个class属性,其中包含一个外部参数中指定的值)

<nums>
   <num class="someNewAttribValue">01</num>
   <num>02</num>
   <num>03</num>
   <num class="someNewAttribValue">04</num>
   <num>05</num>
   <num>06</num>
   <num class="someNewAttribValue">07</num>
   <num>08</num>
   <num>09</num>
   <num class="someNewAttribValue">10</num>
</nums>

<强> II。 XSLT 2.0解决方案:

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

 <xsl:param name="pNewValue" select="'someNewAttribValue'"/>

 <xsl:template match="/*">
     <nums>
       <xsl:for-each-group select="*" group-adjacent="position() mod 3 eq 1">
         <xsl:sequence select="current-group()[not(current-grouping-key())]"/>
         <xsl:apply-templates select="current-group()[current-grouping-key()]"/>
       </xsl:for-each-group>
     </nums>
 </xsl:template>

 <xsl:template match="num">
  <num class="{$pNewValue}"/>
 </xsl:template>
</xsl:stylesheet>

当在同一个XML文档(上面)上应用此XSLT 2.0转换时,会生成相同的想要的正确结果

<nums>
   <num class="someNewAttribValue"/>
   <num>02</num>
   <num>03</num>
   <num class="someNewAttribValue"/>
   <num>05</num>
   <num>06</num>
   <num class="someNewAttribValue"/>
   <num>08</num>
   <num>09</num>
   <num class="someNewAttribValue"/>
</nums>