在XML与XSL技术的结合应用中,对字符串进行分割处理是一项常见的需求,尤其是在需要将一个包含多个值的属性或元素拆分为多个单独元素时。本文将深入探讨如何利用XSLT中的`substring-before()`和`substring-after()`函数来实现这一功能,并通过具体的示例代码加以说明。 ### XSLT中的`substring-before()`与`substring-after()` 在XSLT中,`substring-before()`和`substring-after()`是两个非常有用的函数,它们分别用于获取一个字符串在另一个字符串前或后的部分。这两个函数都接受两个参数:第一个参数是要搜索的主字符串,第二个参数是作为分隔符的子字符串。例如: - `substring-before("hello, world", ",")` 返回 `"hello"`。 - `substring-after("hello, world", ",")` 返回 `"world"`。 ### 示例代码分析 #### XML源文档(`test.xml`) ```xml <data_info CC_ID='195,196,197,198'/> ``` 在这个例子中,`<data_info>`元素包含了一个名为`CC_ID`的属性,其值由逗号`,`分隔的一系列数字组成。 #### XSLT样式表(`test.xsl`) ```xml <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- ... --> <xsl:template match="/data_info"> <xsl:element name="{name()}"> <xsl:call-template name="splitStr"> <xsl:with-param name="str" select="@CC_ID"/> <xsl:with-param name="ctrlname" select="'CC_ID'"/> </xsl:call-template> </xsl:element> </xsl:template> <xsl:template name="splitStr"> <xsl:param name="str"/> <xsl:param name="ctrlname"/> <xsl:element name="input"> <xsl:attribute name="name"><xsl:value-of select="$ctrlname"/></xsl:attribute> <xsl:attribute name="value"> <xsl:choose> <xsl:when test="contains($str,',')"><xsl:value-of select="substring-before($str,',')"/></xsl:when> <xsl:otherwise><xsl:value-of select="$str"/></xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:element> <xsl:if test="contains($str,',')"> <xsl:call-template name="splitStr"> <xsl:with-param name="str" select="substring-after($str,',')"/> <xsl:with-param name="ctrlname" select="$ctrlname"/> </xsl:call-template> </xsl:if> </xsl:template> <!-- ... --> </xsl:stylesheet> ``` 在这个XSLT样式表中,定义了两个主要的模板:一个是匹配`<data_info>`元素的模板,另一个是执行字符串分割的自定义模板`splitStr`。 - 在`<data_info>`模板中,通过调用`splitStr`模板并传递`@CC_ID`属性的值和控制名称`'CC_ID'`作为参数,开始处理字符串分割的过程。 - `splitStr`模板接收一个字符串`$str`和一个控制名称`$ctrlname`。它首先创建一个新的`<input>`元素,并将其`name`属性设置为`$ctrlname`的值,然后根据`$str`是否包含逗号来决定`value`属性的值。如果`$str`包含逗号,则`value`属性被设置为`substring-before($str,',')`的结果;如果不包含,则`value`属性被设置为整个`$str`的值。之后,如果`$str`仍然包含逗号,`splitStr`模板会递归地再次调用自身,传入`substring-after($str,',')`的结果作为新的`$str`值。 ### 结果文档 当将`test.xml`通过`test.xsl`转换后,得到的结果文档如下所示: ```xml <data_info> <input name="CC_ID" value="195"/> <input name="CC_ID" value="196"/> <input name="CC_ID" value="197"/> <input name="CC_ID" value="198"/> </data_info> ``` 该结果文档显示了`CC_ID`属性的每个独立值被成功地分割并封装在了各自的`<input>`元素中,每个`<input>`元素都有一个`name`属性,其值为`CC_ID`,以及一个`value`属性,其值为分割出的单个ID值。这充分展示了如何在XSLT中利用`substring-before()`和`substring-after()`函数来有效地处理字符串分割任务。
发新文章 联系 订阅管理
xml+xsl中分割字符
http://ssm1226.mblogger.cn/posts/14279.aspx
前几天,论坛上有一问题(详见:http://community.csdn.net/Expert/topic/3237/3237160.xml?temp=.6712152)
解决这个问题,其实主要应用xpath中的两个function:substring-before;substring-after
具体例子如下:
test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<data_info CC_ID='195,196,197,198'/>
-----------------------------------------------------------------------
test.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" encoding="utf-8"/>
<xsl:template match="/data_info">
<xsl:element name="{name()}">
<xsl:call-template name="splitStr">
<xsl:with-param name="str" select="@CC_ID"/>
<xsl:with-param name="ctrlname" select="'CC_ID'"/>
</xsl:call-template>
- 粉丝: 31
- 资源: 56
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 1731260448754.jpeg
- 博图 博途1s保护解除DLL Siemens.Automation.AdvancedProtection.dll
- 基于Java和Shell语言的csj_21_08_20_task1设计源码分享
- 基于Typescript和Python的MNIST卷积神经网络模型加载与预测浏览器端设计源码
- 基于Python的RasaTalk语音对话语义分析系统源码
- 基于Vue框架的租车平台前端设计源码
- 基于Java和C/C++的浙江高速反扫优惠券码830主板设计源码
- 基于Java的一站式退休服务项目源码设计
- 基于Java语言实现的鼎鸿餐厅管理系统设计源码
- 基于Java的iText扩展库:简化PDF创建与中文字体应用设计源码