XSLT - 移除最后一个元素中的逗号

3
我有以下的XSLT宏(在Umbraco中):
<xsl:param name="currentPage"/>
<xsl:template match="/">
  <xsl:apply-templates select="$currentPage/imageList/multi-url-picker" />
</xsl:template>
      <xsl:template match="url-picker">
        <xsl:variable name="url"><xsl:value-of select="./url" /></xsl:variable>
        <xsl:value-of select="concat('&quot;', $url, '&quot;,')" />
    </xsl:template>

我希望在集合中的最后一个url-picker中不添加逗号。我该如何操作? 编辑:仅供参考的XML模式:
<multi-url-picker>
<url-picker mode="URL">
    <new-window>True</new-window>
    <node-id />
    <url>http://our.umbraco.org</url>
    <link-title />
</url-picker>
<url-picker mode="Content">
    <new-window>False</new-window>
    <node-id>1047</node-id>
    <url>/homeorawaytest2.aspx</url>
    <link-title />
</url-picker>
<url-picker mode="Media">
    <new-window>False</new-window>
    <node-id>1082</node-id>
    <url>/media/179/bolero.mid</url>
    <link-title>Listen to this!</link-title>
</url-picker>
<url-picker mode="Upload">
    <new-window>False</new-window>
    <node-id />
    <url>/media/273/slide_temp.jpg</url>
    <link-title />
</url-picker>


好问题,+1。请查看我的答案获取更高效的解决方案。另外,我已经包含了一些定义变量的良好实践建议。 - Dimitre Novatchev
3个回答

6

用途:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>    

    <xsl:template match="url">
        <xsl:if test="not(position()=1)">
            <xsl:text>,</xsl:text>
        </xsl:if>
        <xsl:value-of select="concat('&quot;', ., '&quot;')" />
    </xsl:template>
</xsl:stylesheet>

应用于这个XML文档(未提供任何内容!)时:
<url-picker>
  <url>1</url>
  <url>2</url>
  <url>3</url>
</url-picker>

期望得到的正确结果已经生成:

"1","2","3"

注意:

  1. 您不需要变量$url

  2. 如果您需要这样的变量,请勿创建子节点(这将导致RTF)。始终使用xsl:variableselect属性:

而不是:

<xsl:variable name="url"><xsl:value-of select="./url" /></xsl:variable>

写入:

<xsl:variable name="url" select="url" />

.3. 在编写代码时,使用一些命名规范对变量进行命名是一个好习惯,这样如果意外跳过了$符号,变量名也不会轻易与现有元素的名称相同。例如使用:

<xsl:variable name="vUrl" select="url" />

7
请注意,在这个解决方案中,许多人会在除了最后一个元素之外的每个元素后插入逗号,而Dimitre会在除第一个元素外的每个元素前插入逗号。在许多处理器上,这种方法可能更有效,因为它不需要先行处理。 - Michael Kay
@Dimitre - 感谢您详细的回答和额外的建议 :) 对于初学者来说,这是很棒的XSLT信息。 - Elad Lachmi

2

我不确定它是否适用于您的情况,因为我不知道调用url-picker模板的当前上下文,但您可以添加一个xsl:if...

<xsl:template match="url-picker">
  <xsl:variable name="url"><xsl:value-of select="./url" /></xsl:variable>
  <xsl:value-of select="concat('&quot;', $url, '&quot;')" />
  <xsl:if test="not(position()=last())">
    <xsl:text>,</xsl:text>
  </xsl:if>
</xsl:template>

似乎你没有测试正确的条件——测试总是会返回“false”。 - Dimitre Novatchev
2
它应该不是(position()=last())。last()的值始终大于零,因此将其转换为布尔值始终为true。 - Michael Kay
啊,谢谢你们发现了这个问题,Dimitre和Kay博士。感谢Mads的编辑。 - Daniel Haley

2
你可以检查下一个兄弟节点:
  <xsl:template match="url-picker">
    <xsl:variable name="url"><xsl:value-of select="./url" /></xsl:variable>
    <xsl:value-of select="concat('&quot;', $url, '&quot;')" />
     <xsl:if test="following-sibling::url-picker">
      <xsl:text>,</xsl:text>
    </xsl:if>
  </xsl:template>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接