基于同级节点值检索节点的XSLT技术问题求助
解决XSLT提取Active状态JobProfile对应ID的问题
输入XML
<?xml version="1.0"encoding="UTF-8"?> <Root> <Record> <JobProfile> <Status> <Code>Pending</Code> </Status> <ID> <Code>007</Code> </ID> </JobProfile> <JobProfile> <Status> <Code>Active</Code> </Status> <ID> <Code>003</Code> </ID> </JobProfile> <JobProfile> <Status> <Code>Terminated</Code> </Status> <ID> <Code>004</Code> </ID> </JobProfile> </Record> </Root>
期望输出XML
<Root> <Record> <ID>003</ID> </Record> </Root>
原XSLT代码问题
你提供的XSLT有两处关键错误:
- 路径选择错误:在匹配
/Root/Record的模板中,当前上下文已经是Record节点,xsl:for-each里的Record/JobProfile路径不存在,应该直接写JobProfile。 - 节点结构错误:原模板直接将
Record节点替换为ID,但期望输出需要保留Root和Record层级,在Record内部生成ID节点。
修正后的XSLT代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份转换模板,默认复制所有节点 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配Record节点,自定义处理逻辑 --> <xsl:template match="/Root/Record"> <!-- 保留Record节点 --> <Record> <!-- 筛选出Status/Code为Active的JobProfile --> <xsl:for-each select="JobProfile[Status/Code='Active']"> <!-- 生成ID节点并填入对应Code值 --> <ID> <xsl:value-of select="ID/Code"/> </ID> </xsl:for-each> </Record> </xsl:template> <!-- 忽略所有JobProfile节点,避免被身份模板复制 --> <xsl:template match="JobProfile"/> </xsl:stylesheet>
代码说明
- 身份转换模板:保留默认的节点复制逻辑,确保
Root等需要保留的节点正常输出。 - Record节点处理:
- 先复制
Record节点,维持层级结构。 - 直接筛选
JobProfile[Status/Code='Active'],替代原有的for-each+if组合,更简洁高效。 - 生成目标
ID节点并提取对应Code值。
- 先复制
- JobProfile节点忽略:添加专门的模板匹配
JobProfile,不做任何处理,避免原节点被身份模板复制到输出中。
内容的提问来源于stack exchange,提问作者Integration_Consultant
相关产品推荐
相关产品推荐

