XSLT 根据位置应用属性

发布于 2024-10-10 10:24:25 字数 677 浏览 1 评论 0 原文

我正在将 XSLT 用于基于 960 grid css 框架的网站。

我有跨越页面的 div 列,如果它是一行中的第一个 div,则应该首先应用一个类,如果它是中间一个,则没有类,如果它是行中的第三个,则应该有一个类最后应用。

我真的很摸不着头脑,因为解决这个问题的最佳方法是感谢任何帮助。

下面是我想要最终得到的结构,div 内的数字代表位置。

<div class="container_12">
    <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;">
        <div class="grid_4 alpha">
            1
        </div>
        <div class="grid_4 ">
            2
        </div>
        <div class="grid_4 omega">
            3
        </div>
        <div class="grid_4 alpha">
            4
        </div>
    </div>
</div>

I am using XSLT for a website based on the 960 grid css framework.

I have columns of divs that span across the page if it is the first div in a row it should have a class first applied, if it is the middle one then no class and if it is the 3rd in the row it should have the class last applied.

I am really scratching my head as the best way to go about this any help is appreciated.

Below is the structure I want to end up with, the numbers inside the divs represent the position.

<div class="container_12">
    <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;">
        <div class="grid_4 alpha">
            1
        </div>
        <div class="grid_4 ">
            2
        </div>
        <div class="grid_4 omega">
            3
        </div>
        <div class="grid_4 alpha">
            4
        </div>
    </div>
</div>

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

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

发布评论

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

评论(1

挽手叙旧 2024-10-17 10:24:25

此转换

<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:classes>
  <class class="omega"></class>
  <class class="alpha"></class>
  <class/>
 </my:classes>

 <xsl:variable name="vClasses" select=
  "document('')/*/my:classes/*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="div[@id='main-content']/div">
  <xsl:variable name="vPos123" select=
    "1 + (position() mod 3)"/>
  <div class="{@class} {$vClasses[$vPos123]/@class}">

   <xsl:apply-templates select=
   "node()|@*[not(name()='class')]"/>
  </div>
 </xsl:template>
</xsl:stylesheet>

应用于以下 XML 文档时

<div class="container_12">
    <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;">
        <div class="grid_4">
                     1
        </div>
        <div class="grid_4 ">
                     2
        </div>
        <div class="grid_4">
                     3
        </div>
        <div class="grid_4">
                     4
       </div>
  </div>
</div>

产生所需的正确结果

<div class="container_12">
   <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;">
      <div class="grid_4 alpha">
                     1
        </div>
      <div class="grid_4  ">
                     2
        </div>
      <div class="grid_4 omega">
                     3
        </div>
      <div class="grid_4 alpha">
                     4
       </div>
   </div>
</div>

说明

  1. 身份规则“按原样”复制每个节点,除非被覆盖。

  2. 模板会覆盖 div[@id='main-content']/div

    类型元素的身份规则

  3. 表达式 1 + (position() mod 3) 将位置映射到集合 {2, 3, 1}。

  4. 上述表达式用作全局指定 classes> 元素提取要添加到 div 元素的新 CSS 类

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:classes>
  <class class="omega"></class>
  <class class="alpha"></class>
  <class/>
 </my:classes>

 <xsl:variable name="vClasses" select=
  "document('')/*/my:classes/*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="div[@id='main-content']/div">
  <xsl:variable name="vPos123" select=
    "1 + (position() mod 3)"/>
  <div class="{@class} {$vClasses[$vPos123]/@class}">

   <xsl:apply-templates select=
   "node()|@*[not(name()='class')]"/>
  </div>
 </xsl:template>
</xsl:stylesheet>

when applied on the following XML document:

<div class="container_12">
    <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;">
        <div class="grid_4">
                     1
        </div>
        <div class="grid_4 ">
                     2
        </div>
        <div class="grid_4">
                     3
        </div>
        <div class="grid_4">
                     4
       </div>
  </div>
</div>

produces the wanted, correct result:

<div class="container_12">
   <div id="main-content" class="alpha grid_12" style="margin-bottom: 20px;">
      <div class="grid_4 alpha">
                     1
        </div>
      <div class="grid_4  ">
                     2
        </div>
      <div class="grid_4 omega">
                     3
        </div>
      <div class="grid_4 alpha">
                     4
       </div>
   </div>
</div>

Explanation:

  1. The identity rule copies every node "as-is", unless overridden.

  2. A template overrides the identity rule for elements of the kind div[@id='main-content']/div

  3. The expression 1 + (position() mod 3) maps the position into the set {2, 3, 1}.

  4. The above expression is used as an index into the children of the globally specified <my:classes> element to extract the new CSS class to be added to the div element

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文