XSLT 1.0如何提取列表指定元素文本拼接生成元素属性值
问题修正说明
原代码存在以下几类错误,会直接导致运行失败或结果不符合预期:
- XPath路径错误:输入XML中
WORK节点下的子节点是带复数后缀的TASKS,原代码写为WORK/TASK/OFFICE,无法匹配到任何OFFICE节点。 - 函数语法错误:
normalize-space函数名被错误写为带多余横杠和空格的normalize- space;且XSLT 1.0不支持在路径步进后直接调用函数,需要将目标节点作为参数传入函数。 - 硬编码逻辑缺陷:取最后一个
var节点时硬编码索引为[5],如果后续节点数量增减会直接失效,应该用内置的last()函数定位最后一个节点。 - 标签结构错误:
xsl:for-each标签没有编写对应的闭合标签,会触发XSLT解析语法错误。 - 配置与命名不匹配:
xsl:output的输出方法设置为html,不符合XML输出要求;自定义属性名原代码写为首字母大写的Complete,和期望输出的小写complete不一致;额外引入了完全用不到的exslt日期命名空间。
修正后的XSLT 1.0代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output version="1.0" encoding="UTF-8" standalone="yes" indent="yes" method="xml"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <Branch> <xsl:for-each select="WORK/TASKS/OFFICE"> <Company> <xsl:attribute name="complete"> <xsl:value-of select="normalize-space(information/var[1])"/> <xsl:text> </xsl:text> <xsl:value-of select="normalize-space(information/var[2])"/> <xsl:text> </xsl:text> <xsl:value-of select="normalize-space(information/var[last()])"/> </xsl:attribute> </Company> </xsl:for-each> </Branch> </xsl:template> </xsl:stylesheet>
代码中用
<xsl:text> </xsl:text>手动拼接三个文本段之间的空格,避免全局strip-space配置导致文本粘连;取最后一个var节点使用var[last()]语法,不依赖固定的节点总数,适配性更强。
内容的提问来源于stack exchange,提问作者runy29
相关产品推荐
相关产品推荐

