html - 从逗号分隔的字符串 [XML/XSL] 创建选择下拉列表
问题描述
我正在一个旧版电子商务网站上运行一个非常旧版本的 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>
这导致下面的输出,它似乎在我的模板输出周围输出双引号,使其损坏。
我的选择标签的控制台输出 我想我需要以某种方式转义我的代码,但我不确定。我觉得我在强迫 XSL 做一些它不应该做的事情。
任何帮助或替代方案都会很棒谢谢
解决方案
这可能是由于您尝试创建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>
请注意在创建属性时使用属性值模板(大括号)。
另请注意,您也不需要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>
推荐阅读
- sql - 多年来,如何使这个 SQL Server 脚本动态化?
- android - 在 UI 线程中完成工作时缺少触摸事件
- excel - Excel:单元格的条件“消隐”
- c# - 如何为 Office 插件创建静默安装程序
- hadoop - 如何使用 Scalamock 模拟 Hadoop FileStatus 类?
- google-apps-script - 如何通过谷歌脚本将文本填充设置为谷歌幻灯片形状?
- sql - 我需要支持 sql 查询
- angular - IONIC 4 + Angular7:ERROR 错误:未捕获(承诺):TypeError:无法读取未定义的属性“then”
- tfs - 你可以只使用查询字符串的 TFS API 吗?尝试从 Slack 排队构建
- excel - Excel 不计算公式