xslt 的新手。在 umbraco 中使用它,所以它是 1.0 版。
尝试在内联页脚列表中的链接之间插入分隔符,因此将它们放在除第一个链接之外的每个链接之前。这是一个简单的编程问题,您在循环外将标志设置为 0,然后一旦进入,您测试标志是否为 1,如果不是,则跳过在链接前添加分隔符。作为第一次循环中的最后一位,您将标志设置为 1。
我怎样才能在 xslt 中做到这一点?我对语法有点困惑,并且读到一旦设置了变量值,就无法更改它。有人有一个简单的例子吗?
这是一个简单的例子:
<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 是一种函数式语言——这意味着变量一旦定义就无法更改。
标准的 XPathposition()
函数可用于检查当前节点的位置是否具有特定值。
使用内置 XSLT 模板,匹配元素的模板具有以下正文:<xsl:apply-templates/>
。这是:的缩写,<xsl:apply-templates select="child::node()"/>
并将模板应用于当前节点的所有子节点——按文档顺序。
因为我们已经指定<xsl:strip-space elements="*"/>
了 ,所以在 XML 文档的解析过程中,任何元素的纯空格子元素都已被去除。这仅留下顶部元素的非空白子节点,nums
它们都是num
元素。
模板内函数的值position()
是当前节点在<xsl:apply-templates>
执行指令时形成的节点列表中的位置。这意味着position()
模板匹配内部函数的值在处理num
第一个元素时为1,在num
处理第二个元素时为2 num
,...,在处理第10个num
元素时为10。
为值大于 1的所有num
元素生成的输出以字符串“,”开头——完全符合这个问题的要求。position()
对于第一个num
元素,不会生成字符串“,”,因为position()
在这种情况下的值为 1。
XSLT 中没有时间之类的东西。你无法检测到“第一次通过循环”,因为没有时间的概念,因此没有第一次,实际上,它根本不是传统编程意义上的循环。输入列表中的所有项目在概念上都是并行处理的。这就是为什么您不能设置变量以在以后的迭代中使用 - 没有“以后的迭代”之类的东西。
您可以做的是检测您正在处理输入序列中的第一项(或排序后输入序列中的第一项,如果您使用 xsl:sort)。你用 test 来做到这一点position() = 1
。