Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT根据位置应用属性_Xslt_Umbraco - Fatal编程技术网

XSLT根据位置应用属性

XSLT根据位置应用属性,xslt,umbraco,Xslt,Umbraco,我正在为一个基于960网格css框架的网站使用XSLT 我有跨越页面的div列,如果它是一行中的第一个div,它应该首先应用一个类,如果它是中间的一个,那么就没有类,如果它是该行中的第三个div,它应该最后应用一个类 我真的抓挠我的头,因为最好的方式去做这件事,任何帮助都是感激的 下面是我想要结束的结构,div中的数字代表位置 <div class="container_12"> <div id="main-content" class="alpha grid_12"

我正在为一个基于960网格css框架的网站使用XSLT

我有跨越页面的div列,如果它是一行中的第一个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.
3.
4.

此转换:

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

应用于以下XML文档时

<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>
<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.
3.
4.
生成所需的正确结果

<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>
<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.
3.
4.
说明

<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>
<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>
  • 标识规则“按原样”复制每个节点,除非被覆盖

  • 模板覆盖
    div[@id='main-content']/div类元素的标识规则

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

  • 上述表达式用作全局指定的
    元素的子元素的索引,以提取要添加到
    div
    元素的新CSS类


  • 此转换

    <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>
    
    <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>
    
    
    
    应用于以下XML文档时

    <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>
    
    <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.
    3.
    4.
    
    生成所需的正确结果

    <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>
    
    <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.
    3.
    4.
    
    说明

    <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>
    
    <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>
    
  • 标识规则“按原样”复制每个节点,除非被覆盖

  • 模板覆盖
    div[@id='main-content']/div类元素的标识规则

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

  • 上述表达式用作全局指定的
    元素的子元素的索引,以提取要添加到
    div
    元素的新CSS类


  • 我不喜欢umbraco的问题,因为它们远远超出标准XSLT。。。但是我可以告诉你,你想要一个带有
    mod
    操作符的东西:当$position mod 3=1,然后是alpha,当$position mod 3=0,然后是omega…谢谢,你能不能给我一个答案,这样我就可以把它标记为已接受?好问题,+1。请参阅我的答案,以获得完整而简短的解决方案。:)我不喜欢umbraco的问题,因为它们远远超出标准XSLT。。。但是我可以告诉你,你想要一个带有
    mod
    操作符的东西:当$position mod 3=1,然后是alpha,当$position mod 3=0,然后是omega…谢谢,你能不能给我一个答案,这样我就可以把它标记为已接受?好问题,+1。请参阅我的答案,以获得完整而简短的解决方案。:)