XSLT使用动态数字获取第n个节点

时间:2011-09-08 14:32:52

标签: xslt dynamic loops

我需要为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值转换为书面等效值?

3 个答案:

答案 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>