xslt新手。在umbraco中使用它,因此它的版本为1.0。
尝试在内联页脚列表中的链接之间插入分隔符,因此将它们放在除第一个链接之外的每个链接之前。这是一个简单的编程问题,你在循环外设置一个标志为0,然后一旦进入,你测试标志是否为1,如果不是,你跳过在链接之前添加一个分隔符。作为第一次通过循环的最后一位,将标志设置为1.
如何在xslt中完成此操作?我对语法和阅读感到有些不安,一旦设置了变量值,你就无法改变它。任何人都有一个简单的例子吗?
答案 0 :(得分:3)
以下是一个简单示例:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pBase" select="'http://myBase.com/'"/>
<xsl:template match="num">
<xsl:if test="position() > 1">, </xsl:if>
<a href="{$pBase}{.}"><xsl:value-of select="."/></a>
</xsl:template>
</xsl:stylesheet>
对以下XML文档应用此转换时:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
产生了想要的正确结果:
<a href="http://myBase.com/01">01</a>, <a href="http://myBase.com/02">02</a>, <a href="http://myBase.com/03">03</a>, <a href="http://myBase.com/04">04</a>, <a href="http://myBase.com/05">05</a>, <a href="http://myBase.com/06">06</a>, <a href="http://myBase.com/07">07</a>, <a href="http://myBase.com/08">08</a>, <a href="http://myBase.com/09">09</a>, <a href="http://myBase.com/10">10</a>
,并在浏览器中显示为:
01,02,03,04,05,06,07,08 ,09,10
<强>解释强>
XSLT是一种函数式语言 - 除此之外,这意味着变量一旦定义就无法更改。
标准XPath position()
功能可用于检查当前节点的位置是否具有特定值。
使用 builtin XSLT templates ,与元素匹配的元素具有此正文:<xsl:apply-templates/>
。这是:<xsl:apply-templates select="child::node()"/>
的缩写,并将模板应用于当前节点的所有节点子节点 - 按文档顺序。
因为我们已经指定了<xsl:strip-space elements="*"/>
,所以在解析XML文档期间,任何元素的空白子元素都被剥离了。这只留下顶部元素nums
的非空白子节点,它们都是num
个元素。
模板内position()
函数的值是执行<xsl:apply-templates>
指令时形成的节点列表中当前节点的位置。这意味着在处理第一个position()
元素时,匹配num
的模板中num
函数的值为1,处理第二个num
元素时为2。 ..,10处理第10个num
元素时。
num
的值大于1的所有position()
元素的生成输出以字符串“,”开头 - 完全按照此问题的要求。对于第一个num
元素,不会生成字符串“,”,因为在这种情况下position()
的值为1.
答案 1 :(得分:2)
在XSLT中没有时间这样的东西。你无法检测到“第一次循环”,因为没有时间概念,因此没有第一次,事实上,它根本不是传统编程意义上的循环。输入列表中的所有项目在概念上并行处理。这就是为什么你不能设置变量以便在以后的迭代中使用 - 没有“后来的迭代”这样的东西。
您可以做的是检测您正在处理输入序列中的第一项(或排序后输入序列中的第一项,如果您使用xsl:sort)。您可以使用测试position() = 1
执行此操作。