如何在XSL文件中引入另一个XSL并复用日期格式化函数
没问题,我来帮你理清楚怎么搞定这个!你已经用了<xsl:include>,接下来只需要几个关键步骤就能在2.xsl里用上1.xsl的日期转换函数了:
第一步:确认1.xsl里的日期处理逻辑类型
首先得搞清楚1.xsl里的日期转换是用自定义函数(XSLT 2.0+)还是模板(XSLT 1.0),因为两种方式的调用方法不一样:
- 如果是XSLT 2.0+的自定义函数,它会是类似这样的结构(通常带命名空间):
<!-- 1.xsl 示例 --> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://your-custom-namespace.com"> <xsl:function name="my:format-date" as="xs:string"> <xsl:param name="input-date" as="xs:date"/> <!-- 比如把YYYY-MM-DD转成DD/MM/YYYY --> <xsl:value-of select="concat(day-from-date($input-date), '/', month-from-date($input-date), '/', year-from-date($input-date))"/> </xsl:function> </xsl:stylesheet>
- 如果是XSLT 1.0的模板(因为1.0不支持自定义函数),结构会是这样:
<!-- 1.xsl 示例 --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template name="format-date"> <xsl:param name="input-date"/> <!-- 字符串拆分处理日期格式 --> <xsl:variable name="day" select="substring($input-date, 9, 2)"/> <xsl:variable name="month" select="substring($input-date, 6, 2)"/> <xsl:variable name="year" select="substring($input-date, 1, 4)"/> <xsl:value-of select="concat($day, '/', $month, '/', $year)"/> </xsl:template> </xsl:stylesheet>
第二步:确保<xsl:include>的正确使用
把<xsl:include href="1.xsl"/>放在2.xsl的<xsl:stylesheet>根元素内部,路径要准确——如果1.xsl和2.xsl在同一目录,直接写文件名就行;如果不在同一目录,要写相对路径(比如./functions/1.xsl)。
第三步:在2.xsl里调用日期处理逻辑
根据1.xsl的类型来调用:
情况1:调用XSLT 2.0+的自定义函数
- 首先在2.xsl里声明和1.xsl完全一致的命名空间(比如上面的
xmlns:my="http://your-custom-namespace.com") - 处理
<Date>标签时,调用函数并传入正确的参数:
<!-- 2.xsl 示例片段 --> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://your-custom-namespace.com"> <xsl:include href="1.xsl"/> <xsl:template match="Client"> <div> <p>姓名:<xsl:value-of select="Name"/> <xsl:value-of select="Surname"/></p> <p>格式化日期:<xsl:value-of select="my:format-date(xs:date(Date))"/></p> </div> </xsl:template> </xsl:stylesheet>
注意:这里用xs:date(Date)把字符串类型的日期转成XSLT的日期类型,确保和函数参数类型匹配。
情况2:调用XSLT 1.0的模板
直接用<xsl:call-template>调用模板,并传递日期参数:
<!-- 2.xsl 示例片段 --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:include href="1.xsl"/> <xsl:template match="Client"> <div> <p>姓名:<xsl:value-of select="Name"/> <xsl:value-of select="Surname"/></p> <p>格式化日期: <xsl:call-template name="format-date"> <xsl:with-param name="input-date" select="Date"/> </xsl:call-template> </p> </div> </xsl:template> </xsl:stylesheet>
几个常见坑要避开
- XSLT版本一致性:1.xsl和2.xsl的
version属性要一致,比如都是2.0或者都是1.0,不然会出现兼容性问题。 - 命名空间冲突:如果1.xsl用了自定义命名空间,2.xsl必须声明完全相同的命名空间前缀和URI,不然找不到函数。
- 日期格式合法性:确保XML里的
<Date>值是合法的日期格式(比如2018-03-23),不然转成xs:date时会报错。
内容的提问来源于stack exchange,提问作者Name
相关产品推荐
相关产品推荐

