You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用XSLT实现Base与Sub节点的Student_ID值对比提取

实现需求的XSLT解决方案

基础版本XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 匹配XML根节点,开始处理 -->
    <xsl:template match="/">
        <Data>
            <!-- 遍历Sub节点下的所有Student_ID -->
            <xsl:for-each select="Data/Sub/Student_ID">
                <!-- 判断当前Student_ID的内容是否在Base节点的Student_ID中存在 -->
                <xsl:if test="text() = /Data/Base/Student_ID/text()">
                    <!-- 复制符合条件的Student_ID元素到输出 -->
                    <xsl:copy-of select="."/>
                </xsl:if>
            </xsl:for-each>
        </Data>
    </xsl:template>
</xsl:stylesheet>

代码解释

  • <xsl:stylesheet>:XSLT的根元素,指定版本和命名空间,是所有XSLT文件的必备开头。
  • <xsl:template match="/">:匹配XML的根节点(整个文档),所有处理逻辑从这里启动。
  • <xsl:for-each select="Data/Sub/Student_ID">:循环遍历Sub节点下的每一个Student_ID元素。
  • <xsl:if test="text() = /Data/Base/Student_ID/text()">:判断当前Student_ID的文本内容,是否能在Base节点的任意一个Student_ID中找到匹配值。
  • <xsl:copy-of select=".">:把当前符合条件的Student_ID元素完整复制到输出结果里。

高效优化版本(适合大数据量场景)

如果XML里包含大量Student_ID,基础版本每次判断都要遍历整个Base节点,效率较低。可以用xsl:key建立索引优化:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 定义键:用Base节点下Student_ID的文本作为键值 -->
    <xsl:key name="baseStudentIds" match="Base/Student_ID" use="text()"/>

    <xsl:template match="/">
        <Data>
            <!-- 直接筛选Sub中存在于Base的Student_ID -->
            <xsl:copy-of select="Data/Sub/Student_ID[key('baseStudentIds', text())]"/>
        </Data>
    </xsl:template>
</xsl:stylesheet>

这个版本里,xsl:key提前给Base的Student_ID建立索引,后续用key()函数查找时速度更快,逻辑也更简洁。

运行方式

把你的输入XML和上面任意一份XSLT文件,用XSLT处理器(比如Saxon、Xalan,或者在线XSLT转换工具)进行转换,就能得到期望的输出结果。

内容的提问来源于stack exchange,提问作者Thusara Deemantha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:45:41