2

Xsltmodについて質問があります。3番目ごとのdivクラスを「clmn-3doublespace」から「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>

よろしくお願いしますアレックス

4

1 に答える 1

1

I. 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>

必要な正しい結果 (3 つおき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>

Ⅱ.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>

この XSLT 2.0 変換が同じ XML ドキュメント (上記) に適用されると、同じように正しい結果が生成されます。

<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>
于 2012-07-05T03:17:06.850 に答える