xslt的新手。在umbraco中使用它,所以它的版本为1.0。XSLT中的设置标志通过循环第一次检测
尝试在内联页脚列表中的链接之间插入分隔符,因此会将它们放在除第一个链接之外的每个链接之前。这是一个简单的编程问题,您在循环外部将标志设置为0,然后一旦进入,您测试标志是否为1,如果不是,则跳过链接前添加分隔符。作为循环第一遍中的最后一位,您将标志设置为1.
如何在xslt中完成此操作?语法和阅读让我有些失望,一旦变量值被设置,你就无法改变它。任何人都有一个简单的例子?
xslt的新手。在umbraco中使用它,所以它的版本为1.0。XSLT中的设置标志通过循环第一次检测
尝试在内联页脚列表中的链接之间插入分隔符,因此会将它们放在除第一个链接之外的每个链接之前。这是一个简单的编程问题,您在循环外部将标志设置为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>
并且它显示在浏览器作为:
说明:
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>
指令时形成的节点列表中当前节点的位置。这意味着在处理第一个num
元素时,模板匹配num
内的position()
函数的值为1,处理第二个num
元素时为2,...,当第10个num
元素被处理时为10。
其中position()
的值大于1的所有num
元素的生成输出以字符串“,”开始 - 完全按照此问题的要求。对于第一num
元件字符串“”不产生,因为position()
在这种情况下,值为1
有作为XSLT时间没有这样的事情。由于没有时间概念,因此无法检测到“第一次通过循环”,因此不是第一次,事实上,它根本不是传统编程意义上的循环。输入列表中的所有项目都在概念上并行处理。这就是为什么你不能在后面的迭代中设置变量 - 没有像“后来的迭代”那样的事情。
你可以做的是检测到您正在处理的输入序列的第一项(在输入序列或中的第一项进行排序后,如果您使用xsl:排序)。你用测试position() = 1
来做到这一点。
请提供样品输入XML。 –
显示您的输入,XSLT代码和预期输出。 XSLT在其他过程语言的意义上没有可变变量,所以“通过循环第一次设置标志”是不可能的。 –
另请阅读[常见问题]和[问]提出有关提问的提示。 –