如何筛选wd:Job_Classification_Group_ID为BB的首个wd:Job_Profile元素
解决方案
问题背景
- 核心需求:从XML数据中筛选
wd:Job_Classification_Group_ID值为'BB'的wd:Job_Profile节点,仅保留每个符合条件节点对应的首个位置条目,最终输出为CSV格式文件 - 当前问题:现有XSLT转换后返回2条带BB值的记录,与预期仅输出1条结果的要求不符
常见触发原因
绝大多数该类异常由XPath筛选逻辑的谓词优先级错误导致:
- 位置筛选谓词
[1]的作用范围错误,未限定为全局首个符合条件的wd:Job_Profile节点,而是遍历了所有符合条件的节点- 位置条目筛选未加
[1]限定,同一个wd:Job_Profile下的多个位置条目被多次输出wd命名空间声明不完整,导致节点匹配时误识别重复节点
修复代码示例
<!-- 请将此处wd命名空间的URI替换为你实际业务中对应的命名空间地址 --> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="http://www.workday.com/your/actual/namespace"> <xsl:output method="text" encoding="UTF-8" omit-xml-declaration="yes"/> <!-- 根模板:输出CSV表头 + 仅调用首个符合条件的节点 --> <xsl:template match="/"> <!-- 输出CSV表头,可根据实际字段调整 --> <xsl:text>Job_Profile_ID,Position_ID,Job_Group_ID </xsl:text> <!-- 核心筛选:先匹配所有符合BB条件的Job_Profile,再取全局第一个 --> <xsl:apply-templates select="(//wd:Job_Profile[wd:Job_Classification_Group_ID = 'BB'])[1]"/> </xsl:template> <!-- 匹配符合条件的Job_Profile节点,输出单条CSV行 --> <xsl:template match="wd:Job_Profile"> <!-- 输出Job_Profile唯一标识 --> <xsl:value-of select="wd:Job_Profile_ID"/> <xsl:text>,</xsl:text> <!-- 仅取当前节点下的首个位置条目 --> <xsl:value-of select="(wd:Position_Entry)[1]/wd:Position_ID"/> <xsl:text>,</xsl:text> <xsl:value-of select="wd:Job_Classification_Group_ID"/> <!-- 换行符分隔行 --> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet>
关键调整说明
- 谓词优先级控制:用括号将所有符合
wd:Job_Classification_Group_ID='BB'的节点包裹后再加[1],确保仅取全局首个符合条件的wd:Job_Profile节点,避免遍历输出多条 - 位置条目限定:取位置条目时同样加
[1]筛选,仅输出当前wd:Job_Profile下的第一个位置条目,避免多位置条目导致重复行 - 输出格式控制:仅在根模板输出一次CSV表头,避免模板重复调用时重复生成表头
内容的提问来源于stack exchange,提问作者Cristian
相关产品推荐
相关产品推荐

