答疑:按照关键索引,合并XML文档 
2008/3/26 16:31:27
阅读全文(4692) | 回复(8) | 编辑 | 精华
问题:假设现有两个xml文件分别为:文件1:<stu> <sno>001</sno> <sname>张三</sname> <ssex>男</ssex> <sadd>某地</sadd> <sid>123456789012345</sid></stu><stu> <sno>002</sno> <sname>李四</sname> <ssex>男</ssex> <sadd>某地</sadd> <sid>987654321012345</sid></stu>文件2:<info> <sid>123456789012345</sid> <sexamid>2008002</sexamid></info><info> <sid>987654321012345</sid> <sexamid>2008001</sexamid></info> 需求:现在需要以文档中的<sid>节数据为索引,将两个文件合并为一个新的XML文件。要求:将第二个文件的<sexamid>节点添加到第一个文件的<sid>的对应节点。如 <stu> <sno>001</sno> <sname>张三</sname> <ssex>男</ssex> <sadd>某地</sadd> <sid>123456789012345</sid> <sexamid>2008002</sexamid></stu><stu> <sno>002</sno> <sname>李四</sname> <ssex>男</ssex> <sadd>某地</sadd> <sid>987654321012345</sid> <sexamid>2008001</sexamid></stu> 本人答疑: <?xml version="1.0" encoding="gb2312" ?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ><xsl:output method="xml" version="1.0" encoding="gb2312" indent="yes"/><xsl:variable name="temp" select="document('文件2')//info"/><xsl:template match="/"><root> <xsl:apply-templates select="//stu" /></root></xsl:template> <xsl:template match="stu"> <xsl:variable name="id" select="sid"/> <stu> <xsl:copy-of select="*"/> <xsl:copy-of select="$temp[sid=$id]/sexamid"/> </stu></xsl:template> </xsl:stylesheet> 运行结果:如问题需求! 500)this.width=500'> 答疑帖子:http://bbs.xml.org.cn/dispbbs.asp?boardID=8&ID=60435
Posted by Qr on 2008/3/26 16:31:27
回复:[答疑]按照关键索引,合并XML文档
2008/4/22 14:50:25
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
呵呵!我是最近才学xml和xslt的!所以不是很清楚!
Posted by belinda_pjm on 2008/4/22 14:50:25
回复:[答疑]按照关键索引,合并XML文档
2008/4/22 11:16:06
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
呵呵!已经可以了!你去看论坛里面的咯!http://bbs.xml.org.cn/dispbbs.asp?boardID=8&ID=61644 你自己去看看咯! 以下为blog主人的回复: 没有实质区别。我建议你去好好复习一下xsl:apply-templates,xsl:call-template,xsl:for-each的相关知识。
Posted by belinda_pjm on 2008/4/22 11:16:06
回复:[答疑]按照关键索引,合并XML文档
2008/4/21 17:31:18
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
如果你上面的 <xsl:apply-templates select ="//stu"/> 不改成 <xsl:call-template name ="stu"/> 那你的模版有什么意义呢?还不如没有呢? 以下为blog主人的回复: <xsl:template match="stu">不是xsl:apply-templates要去匹配的模板吗?模板非要用命名模板吗?
Posted by belinda_pjm on 2008/4/21 17:31:18
回复:[答疑]按照关键索引,合并XML文档
2008/4/21 16:52:25
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
我是直接用你上面的代码不行!我自己修改后运行的结果就像我上面所说的一样! 以下为blog主人的回复: 把你的代码贴出来我看看,还有运行环境。
Posted by belinda_pjm on 2008/4/21 16:52:25
回复:[答疑]按照关键索引,合并XML文档
2008/4/21 11:57:33
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
我照你的方法去做!他能把节点拷贝过来!但是不是你说的那个结构!他是直接在后面把<sexamid>2008002</sexamid><sexamid>2008001</sexamid>添加在后面!还有 <xsl:apply-templates select="//stu" /> 应该改换成:<xsl:call-template name ="stu"/> 以下为blog主人的回复: 你的意思是说直接应用我的代码得不到图中的结果?还是你将代码修改后得不到图中的结果? 还有,xsl:apply-templates 是将模板运用到当前元素或子节点,而xsl:call-template 是调用一个命名模板,二者有原则上的区别,我的代码中没有使用命名模板,为什么非得用xsl:call-template来调用呢。而且这个需求也没必要使用命名模板吧!况且,前面的代码改用xsl:call-template来调用也得不到如上图的结果吧?怀疑是你在修改代码的问题!
彭建美(游客)
Posted by 彭建美(游客) on 2008/4/21 11:57:33
回复:[答疑]按照关键索引,合并XML文档
2008/4/16 23:49:26
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
为啥我用Altova XMLSpy运行此代码 看不到Qr给出的图片中显示的那种效果呢 谢谢了 以下为blog主人的回复: 我没装XMLSpy,纯粹通过其它方式在IE中查看罢了。XMLSpy看到的应该是类似图中的XML文档风格的转换结果。
freshMan(游客)
Posted by freshMan(游客) on 2008/4/16 23:49:26
回复:[答疑]按照关键索引,合并XML文档
2008/3/31 13:35:41
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
以下引用青青子瑾在2008-3-26 19:24:38的评论: 以下为blog主人的回复: 为什么 看不明白啊。
Posted by 烟雨朦胧 on 2008/3/31 13:35:41
回复:[答疑]按照关键索引,合并XML文档
2008/3/26 19:24:38
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
以下为blog主人的回复: 为什么
Posted by 烟雨朦胧 on 2008/3/26 19:24:38
发表评论: |