2012-11-20 33 views
1

xslt的新手。在umbraco中使用它,所以它的版本为1.0。XSLT中的设置标志通过循环第一次检测

尝试在内联页脚列表中的链接之间插入分隔符,因此会将它们放在除第一个链接之外的每个链接之前。这是一个简单的编程问题,您在循环外部将标志设置为0,然后一旦进入,您测试标志是否为1,如果不是,则跳过链接前添加分隔符。作为循环第一遍中的最后一位,您将标志设置为1.

如何在xslt中完成此操作?语法和阅读让我有些失望,一旦变量值被设置,你就无法改变它。任何人都有一个简单的例子?

+1

请提供样品输入XML。 –

+1

显示您的输入,XSLT代码和预期输出。 XSLT在其他过程语言的意义上没有可变变量,所以“通过循环第一次设置标志”是不可能的。 –

+1

另请阅读[常见问题]和[问]提出有关提问的提示。 –

回答

2

下面是一个简单的例子

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

并且它显示在浏览器作为

01020304050607080910

说明:

  1. XSLT是一种功能语言 - 除此之外,这意味着变量一旦定义就不能改变。

  2. 标准XPath position()功能可用于检查当前节点的位置是否具有特定值。

  3. builtin XSLT templates被使用并且与元素相匹配的元素具有此主体:<xsl:apply-templates/>。这是“<xsl:apply-templates select="child::node()"/>”的缩写,并按照文档顺序将模板应用于当前节点的所有节点子节点。

  4. 因为我们已经指定了<xsl:strip-space elements="*"/>,任何元素的只有空白的子元素在解析XML文档的过程中已被剥离。这只留下顶部元素nums的非空白子节点,它们都是num元素。

  5. 模板内position()函数的值是当执行<xsl:apply-templates>指令时形成的节点列表中当前节点的位置。这意味着在处理第一个num元素时,模板匹配num内的position()函数的值为1,处理第二个num元素时为2,...,当第10个num元素被处理时为10。

  6. 其中position()的值大于1的所有num元素的生成输出以字符串“,”开始 - 完全按照此问题的要求。对于第一num元件字符串“”不产生,因为position()在这种情况下,值为1

+0

只需击败我即可。 :) +1 – ABach

+0

@ABach,下次是你的:)但看到解释。 –

+0

一个问题:你是如何得到'position()'来输出两位数的? libxslt和Saxon似乎只输出单个数字。 – ABach

1

有作为XSLT时间没有这样的事情。由于没有时间概念,因此无法检测到“第一次通过循环”,因此不是第一次,事实上,它根本不是传统编程意义上的循环。输入列表中的所有项目都在概念上并行处理。这就是为什么你不能在后面的迭代中设置变量 - 没有像“后来的迭代”那样的事情。

你可以做的是检测到您正在处理的输入序列的第一项(在输入序列或中的第一项进行排序后,如果您使用xsl:排序)。你用测试position() = 1来做到这一点。