XSLT使用动态编号获取第n个节点

XSLT使用动态编号获取第n个节点,xslt,dynamic,loops,Xslt,Dynamic,Loops,我需要向XSLT模板输出的每个项添加CSS类。类值需要包括节点的位置,这很好,但是位置需要用文字(classOne、classTwo等)而不是数字(class1、class2等)书写 我的代码几乎可以工作。它以数字的形式正确地输出位置,但是当我使用该位置返回数字的书面版本时,它每次只选择第一个,所以我总是得到一个“classOne”类。如果我硬编码的数字,它的工作很好 <xsl:param name="currentPage"/> <xsl:variable name="num

我需要向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值转换成书面等价物吗?

使用
item
。如果不起作用,则需要显示my.library:Split函数返回的数据类型的详细信息。

稍微详细一些,但您可以尝试以下操作:

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

执行所需处理不需要字符串拆分和扩展功能:

I.XSLT 1.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>
这一转变:

<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文档!):


生成所需的正确结果

<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>
 <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>
 <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>
项目
项目
项目
项目
项目
项目
项目
项目
项目
项目

问得好,+1。请参阅我的答案,了解一个简短、简单、纯粹的XSLT1.0解决方案。没有字符串拆分和任何扩展函数。:)还添加了一个XSLT2.0解决方案——更通用、更简单。这行不通,因为我不知道我有多少请求/响应元素(除了我有相同数量的请求和响应)