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