XSLT 2.0代码转XSLT 1.0语法实现字符串拼接功能咨询
XSLT 1.0 转换方案解答
问题2:XSLT 1.0是否支持带参数的call-template调用?
结论:支持。
XSLT 1.0标准原生支持带参数的模板调用,语法和你当前XSLT 2.0代码的写法完全兼容:
- 调用模板时用
<xsl:with-param>传递参数 - 目标模板内部用
<xsl:param>声明接收参数
这部分逻辑不需要修改,可以直接复用。
问题1:XSLT 1.0实现字符串拼接逻辑
XSLT 1.0没有内置reverse()函数,也不支持序列直接用separator属性拼接,我们可以通过xsl:for-each遍历节点轴+倒序排序实现需求,核心逻辑如下:
- 用
ancestor-or-self轴获取当前节点及所有上级父节点 - 按
position()倒序排序,实现从最顶层父节点到当前节点的顺序 - 遍历过程中判断是否是最后一个节点,控制下划线分隔符的输出
完整可运行XSLT 1.0代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 全局公共变量 --> <xsl:variable name="separator" select="'|'" /> <xsl:variable name="newline" select="' '" /> <xsl:template match="/Root"> <!-- 输出表头 --> <xsl:text>id|parent_id</xsl:text> <xsl:value-of select="$newline"/> <!-- 遍历数据 --> <xsl:for-each select="Package"> <xsl:variable name="b-id" select="Business_ID" /> <xsl:for-each select="TPFC"> <xsl:variable name="total_level" select="count(.//Parent)+1"/> <!-- 输出当前TPFC节点的行 --> <xsl:call-template name="prod-family"> <xsl:with-param name="total_level" select="$total_level"/> <xsl:with-param name="b_id" select="$b-id"/> </xsl:call-template> <!-- 输出所有Parent子节点的行 --> <xsl:for-each select=".//Parent"> <xsl:call-template name="prod-family"> <xsl:with-param name="total_level" select="$total_level"/> <xsl:with-param name="b_id" select="$b-id"/> </xsl:call-template> </xsl:for-each> </xsl:for-each> </xsl:for-each> </xsl:template> <xsl:template name="prod-family"> <xsl:param name="total_level"/> <xsl:param name="b_id"/> <!-- 拼接id字段:包含当前节点 --> <xsl:for-each select="ancestor-or-self::*[local-name()='TPFC' or local-name()='Parent']"> <xsl:sort select="position()" order="descending" /> <xsl:value-of select="translate(Name,' ','')" /> <xsl:if test="position() != last()">_</xsl:if> </xsl:for-each> <xsl:value-of select="$separator"/> <!-- 拼接parent_id字段:不包含当前节点 --> <xsl:for-each select="ancestor::*[local-name()='TPFC' or local-name()='Parent']"> <xsl:sort select="position()" order="descending" /> <xsl:value-of select="translate(Name,' ','')" /> <xsl:if test="position() != last()">_</xsl:if> </xsl:for-each> <xsl:value-of select="$newline"/> </xsl:template> </xsl:stylesheet>
输出验证
使用你提供的输入XML运行上述代码,输出结果和预期完全一致:
id|parent_id Mob2_Mob1_AM|Mob2_Mob1 Mob2_Mob1|Mob2 Mob2|
内容的提问来源于stack exchange,提问作者Sri-nidhi
相关产品推荐
相关产品推荐

