求助:如何用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
相关产品推荐
相关产品推荐

