XSLT получает n-й узел, используя динамический номер - PullRequest
1 голос
/ 08 сентября 2011

Мне нужно добавить классы CSS к каждому выводу элемента с помощью шаблона XSLT.Значения класса должны включать в себя позицию узла, что нормально, но позиция должна быть записана словами (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 ]

2 голосов
/ 08 сентября 2011

Используйте <div class="class{$numbers/*[position() = $index]}">item</div>.Если это не сработает, вам нужно показать детали того, какие данные возвращает ваша функция my.library: Split.

1 голос
/ 08 сентября 2011

Для выполнения требуемой обработки не требуются функции разделения и расширения строк:

I.Решение 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>
0 голосов
/ 08 сентября 2011

Несколько более многословно, но вы можете попробовать что-то вроде:

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