XSLT转换XML到CSV仅提取WorkInfo节点无输出问题求助
解决XSLT转换XML到CSV空结果的问题
嘿,我来帮你排查下问题,你的XSLT代码和XML里有几个关键错误,导致输出为空,咱们一个个说清楚:
主要错误点
- XML与XSLT元素大小写不匹配:XML里的工作信息节点是
<WorkInfo>(首字母大写),但你在XSLT里写的是workInfo(全小写)。XML是严格区分大小写的,这直接导致XSLT找不到目标节点。另外你的XML里还有个小错误:闭合标签是</workInfo>,应该改成</WorkInfo>,否则XML本身解析就会出问题。 - 路径选择错误:根模板
match="/"后,你直接写select="workInfo",但workInfo不是根节点的直接子节点,正确的路径应该是Employees/Employee/WorkInfo(或者进一步定位到它的子节点)。 - 错误使用
<xsl:copy-of>:这个指令会复制整个节点(包括标签),但你需要的是节点里的文本内容,应该用<xsl:value-of>来提取文本。 - 模板未正确闭合:你的
<xsl:template match="PersonalInfo">后面没有写闭合的</xsl:template>,这会导致XSLT解析失败。 - 多余的模板调用:你本来想忽略
PersonalInfo,但根模板里还是调用了<xsl:apply-templates select="PersonalInfo"/>,其实完全可以去掉这个调用,或者写个空模板直接忽略它。
修正后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:strip-space elements="*"/> <!-- 匹配根节点,定位到所有Employee下的WorkInfo子节点 --> <xsl:template match="/"> <xsl:apply-templates select="Employees/Employee/WorkInfo/*"/> </xsl:template> <!-- 处理WorkInfo的每个子节点,输出文本并添加分隔符 --> <xsl:template match="WorkInfo/*"> <xsl:value-of select="."/> <!-- 最后一个子节点不输出逗号 --> <xsl:if test="not(position()=last())">,</xsl:if> </xsl:template> <!-- 直接忽略PersonalInfo节点,不做任何处理 --> <xsl:template match="PersonalInfo"/> </xsl:stylesheet>
代码说明
- 根模板直接定位到
Employees/Employee/WorkInfo/*,也就是WorkInfo下的所有子元素(Skill、Experience、PreviousCompany),确保只处理你需要的内容。 - 针对WorkInfo的子节点,用
<xsl:value-of>提取文本内容,并且通过position()=last()判断,只有非最后一个节点才添加逗号,避免末尾多余的分隔符。 - 专门写了一个匹配
PersonalInfo的空模板,确保这个节点被完全忽略,不会输出任何内容。
用这个修正后的代码,配合修正了闭合标签的XML,就能得到你期望的输出:Java,10,XYZ。
内容的提问来源于stack exchange,提问作者LearnToLive
相关产品推荐
相关产品推荐

