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

发布于 2024-12-03 17:36:04 字数 782 浏览 1 评论 0原文

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

I need to add CSS classes to each item output by an XSLT template. The class values need to include the position of the node, which is fine, but the position needs to be written in words (classOne, classTwo etc) rather than a digits (class1, class2 etc).

The code I have almost works. It outputs the position correctly as a number, but when I use that position to return the written version of the number it just picks the first one every time, so I always get a class of 'classOne'. If I hard-code the number it works fine.

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

Can anyone see how I can get it to convert the $index value into the written equivalent?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

使用

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

Use <div class="class{$numbers/*[position() = $index]}">item</div>. If that does not work then you need to show details of what kind of data your my.library:Split function returns.

递刀给你 2024-12-10 17:36:05

不需要字符串分割和扩展函数来执行所需的处理:

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>

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

No string-splitting and extension functions are necessary to carry out the required processing:

I. XSLT 1.0 Solution

This transformation:

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

when applied on this XML document (no source XML document was provided!):

<t>
 <largeImageA/>
 <largeImageB/>
 <largeImageC/>
 <largeImageD/>
 <largeImageE/>
 <largeImageF/>
 <largeImageG/>
 <largeImageH/>
 <largeImageI/>
 <largeImageJ/>
</t>

produces the wanted, correct result:

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

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

when applied on the same XML document (above), the same correct result is produced:

 <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>
温馨耳语 2024-12-10 17:36:05

有点更冗长,但你可以尝试类似的方法:

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

Somewhat more verbose, but you could try something like:

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

you can call it with:

<xsl:call-template name="int2str">
  <xsl:with-param name="val" select="$index"/>
</xsl:call-template>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文