我需要为XSLT模板输出的每个项添加CSS类。类值需要包含节点的位置,这很好,但位置需要用单词(classOne,classTwo等)而不是数字(class1,class2等)来写。
我的代码几乎可以使用。它正确输出位置作为数字,但当我使用该位置返回数字的书面版本时,它每次都会选择第一个,所以我总是得到一个'classOne'类。如果我对数字进行硬编码就可以了。
<xsl:param name="currentPage"/>
<xsl:variable name="numbers" select="my.library:Split('One,Two,Three,Four,Five,Six,Seven,Eight',',')"/>
<xsl:template match="/">
<xsl:apply-templates select="$currentPage/*[starts-with(name(), 'largeImage')]" mode="large" />
</xsl:template>
<xsl:template match="*" mode="large">
<xsl:variable name="index" select="substring(name(), 11)"/>
<div class="class{$numbers/*[$index]}">item</div>
</xsl:template>
任何人都可以看到我如何将$ index值转换为书面等效值?
答案 0 :(得分:2)
使用<div class="class{$numbers/*[position() = $index]}">item</div>
。如果这不起作用,那么你需要显示你的my.library:Split函数返回的数据类型的详细信息。
答案 1 :(得分:1)
执行所需的处理不需要字符串拆分和扩展功能:
<强>予。 XSLT 1.0解决方案
这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my" exclude-result-prefixes="my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<my:nums>
<num>one</num>
<num>two</num>
<num>three</num>
<num>four</num>
<num>five</num>
<num>six</num>
<num>seven</num>
<num>eight</num>
<num>nine</num>
<num>ten</num>
</my:nums>
<xsl:variable name="vNums" select="document('')/*/my:nums/*"/>
<xsl:template match="*[starts-with(name(), 'largeImage')]">
<xsl:variable name="vIndex">
<xsl:number count="*[starts-with(name(), 'largeImage')]"
level="any"/>
</xsl:variable>
<div class="class{$vNums[position() = $vIndex]}">item</div>
</xsl:template>
</xsl:stylesheet>
应用于此XML文档(未提供源XML文档!):
<t>
<largeImageA/>
<largeImageB/>
<largeImageC/>
<largeImageD/>
<largeImageE/>
<largeImageF/>
<largeImageG/>
<largeImageH/>
<largeImageI/>
<largeImageJ/>
</t>
生成想要的正确结果:
<div class="classone">item</div>
<div class="classtwo">item</div>
<div class="classthree">item</div>
<div class="classfour">item</div>
<div class="classfive">item</div>
<div class="classsix">item</div>
<div class="classseven">item</div>
<div class="classeight">item</div>
<div class="classnine">item</div>
<div class="classten">item</div>
<强> 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:template match="*[starts-with(name(), 'largeImage')]">
<xsl:variable name="vIndex">
<xsl:number count="*[starts-with(name(), 'largeImage')]"
level="any" format="w"/>
</xsl:variable>
<div class="class{$vIndex}">item</div>
</xsl:template>
</xsl:stylesheet>
应用于同一XML文档(上图)时,会生成相同的正确结果:
<div class="classone">item</div>
<div class="classtwo">item</div>
<div class="classthree">item</div>
<div class="classfour">item</div>
<div class="classfive">item</div>
<div class="classsix">item</div>
<div class="classseven">item</div>
<div class="classeight">item</div>
<div class="classnine">item</div>
<div class="classten">item</div>
答案 2 :(得分:0)
稍微冗长一点,但你可以尝试类似的东西:
<xsl:template name="int2str">
<xsl:param name="val" required="yes"/>
<xsl:choose>
<xsl:when test="$val= 1">One</xsl:when>
<xsl:when test="$val= 2">Two</xsl:when>
<xsl:when test="$val= 3">Three</xsl:when>
<xsl:when test="$val= 4">Four</xsl:when>
<xsl:when test="$val= 5">Five</xsl:when>
<xsl:when test="$val= 6">Six</xsl:when>
<xsl:when test="$val= 7">Seven</xsl:when>
<xsl:when test="$val= 8">Eight</xsl:when>
</xsl:choose>
</xsl:template>
你可以用:
来调用它<xsl:call-template name="int2str">
<xsl:with-param name="val" select="$index"/>
</xsl:call-template>