从逗号分隔的字符串 [XML/XSL] 创建选择下拉列表
Posted
技术标签:
【中文标题】从逗号分隔的字符串 [XML/XSL] 创建选择下拉列表【英文标题】:Creating Select Dropdown from Comma Separated String [XML/XSL] 【发布时间】:2018-12-05 01:22:32 【问题描述】:我正在开发一个运行非常旧版本的 ASPDotNetStoreFront 的传统电子商务网站,完全免责声明我不精通 XML/XSL 我只需要潜入并尝试通过查看其他代码来使代码正常工作代码。
基本上,某些产品的销售数量受到限制。产品页面以逗号分隔的字符串形式接收此信息。例如
"5,10,15,20"
我在下面设置了一个参数来收集这些数据,它可以正常工作
<xsl:param name="restrictedquantities">
<xsl:value-of select="/root/Products2/Product/RestrictedQuantities" />
</xsl:param>
因此,我需要将数量作为单独的选项输出到如下所示的选择标签中
<select>
<option value="5">5</option>
<option value="10">10</option>
<option value="15">15</option>
<option value="20">20</option>
</select>
我已经设法让它 98% 使用下面的代码,我从其他堆栈溢出问题中找到的大部分代码并一直在尝试将其修补在一起,
<xsl:when test="$restrictedquantities != ''">
<select>
<xsl:call-template name="split">
<xsl:with-param name="s" select="$restrictedquantities" />
</xsl:call-template>
</select>
</xsl:when>
然后在下面的模板之外,我创建了另一个模板,该模板通过逗号分割字符串,并在输出时将标签放在值周围。
<xsl:template name="split" xmlns="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="s" />
<xsl:param name="withcomma" select="false()" />
<xsl:choose>
<xsl:when test="contains($s, ',')">
<!-- if there is still a comma, call me again
with everything after the first comma... -->
<xsl:call-template name="split">
<xsl:with-param name="s" select="substring-after($s, ',')" />
<xsl:with-param name="withcomma" select="true()" />
</xsl:call-template>
<!-- ...and print afterwards the current part -->
<option value="<xsl:value-of select="substring-before($s, ',')" />"><xsl:value-of select="substring-before($s, ',')" /></option>
</xsl:when>
<xsl:otherwise>
<!-- No comma left in the remaining part: print the rest -->
<option value="<xsl:value-of select="$s" />"><xsl:value-of select="$s" /></option>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
这导致下面的输出,它似乎在我的模板输出周围输出双引号,使其损坏。
Console output of my select tag 我想我需要以某种方式逃避我的代码,但我不确定。我觉得我在强迫 XSL 做一些它不应该做的事情。
任何帮助或替代方案都会很棒 谢谢
【问题讨论】:
【参考方案1】:这可能是由于您尝试创建 option
标记的方式令人困惑
<option value="<xsl:value-of select="substring-before($s, ',')" />"><xsl:value-of select="substring-before($s, ',')" /></option>
您在此处输出文本,而不是创建新元素。你真的应该这样做......
<option value="substring-before($s, ',')"><xsl:value-of select="substring-before($s, ',')" /></option>
注意在创建属性时使用Attribute Value Templates(大括号)。
另请注意,您也不需要“拆分”模板上的xmlns="http://www.w3.org/1999/XSL/Transform"
。事实上,如果你现在把它留在里面会导致错误,因为这意味着处理器会将option
视为 xsl 元素,并因为它无法识别它而抱怨。
不管怎样,试试这个模板
<xsl:template name="split">
<xsl:param name="s" />
<xsl:param name="withcomma" select="false()" />
<xsl:choose>
<xsl:when test="contains($s, ',')">
<xsl:call-template name="split">
<xsl:with-param name="s" select="substring-after($s, ',')" />
<xsl:with-param name="withcomma" select="true()" />
</xsl:call-template>
<option value="substring-before($s, ',')"><xsl:value-of select="substring-before($s, ',')" /></option>
</xsl:when>
<xsl:otherwise>
<option value="$s"><xsl:value-of select="$s" /></option>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
【讨论】:
非常感谢你,工作就像一个魅力。快速的侧面问题,我使用的拆分功能似乎将顺序反转为 20,15,10,5 有没有办法阻止它这样做?如果没有,那么不用担心。谢谢!很大的帮助。 我已将其标记为答案,但由于我的代表无法投票。对不起! 要保留原始顺序,只需将<option>
元素的创建移到xsl:call-template
之前。
工作就像一个魅力!欣赏!以上是关于从逗号分隔的字符串 [XML/XSL] 创建选择下拉列表的主要内容,如果未能解决你的问题,请参考以下文章
在 Oracle (> 11g) 中从逗号分隔列表创建表 - 输入字符串限制 4000 个字符