2012-07-04 2 views
2

У меня вопрос о моделях Xslt. Мне нужно изменить div-класс каждого третьего div с «clmn-3 doublespace» на «clmn-3». Пробовал несколько советов, но не мог понять, где добавить аргумент.xslt изменить класс для каждого третьего div

<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

Вы забыли дать нам исходный XML-документ. Трансформация проста и всего несколько строк, но мне нужен XML-документ, чтобы применить его и убедиться, что получены правильные и требуемые результаты. Пожалуйста, отредактируйте вопрос и укажите отсутствующую важную информацию. –

ответ

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> 

Когда это преобразование является applie по следующим 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> 

Когда 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> 
Смежные вопросы