以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  Qr用xsl合并两个xml文件[讨论]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=61644)


--  作者:belinda_pjm
--  发布时间:4/21/2008 5:43:00 PM

--  Qr用xsl合并两个xml文件[讨论]
1.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
  <stu>
    <sno>001</sno>
    <sname>张三</sname>
    <ssex>男</ssex>
    <sadd>上海</sadd>
    <sid>1</sid>
  </stu>
  <stu>
    <sno>002</sno>
    <sname>李四</sname>
    <ssex>男</ssex>
    <sadd>湖南</sadd>
    <sid>2</sid>
  </stu>
</root>

2.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
  <info>
    <sid>1</sid>
    <sexamid>2008002</sexamid>
  </info>
  <info>
    <sid>2</sid>
    <sexamid>2008001</sexamid>
  </info>
  <info>
    <sid>3</sid>
    <sexamid>2008003</sexamid>
  </info>
  <info>
    <sid>4</sid>
    <sexamid>2008004</sexamid>
  </info>
</root>

3.xsl
<?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.xml')//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>
它们编译后的结果是这样的吗?
<stu>
     <sno>001</sno>
     <sname>张三</sname>
     <ssex>男</ssex>
     <sadd>上海</sadd>
     <sid>1</sid>
     <sexamid>2008002</sexamid>
</stu>
<stu>
     <sno>002</sno>
     <sname>李四</sname>
     <ssex>男</ssex>
     <sadd>湖南</sadd>
     <sid>2</sid>
     <sexamid>2008001</sexamid>
</stu>


--  作者:belinda_pjm
--  发布时间:4/22/2008 9:31:00 AM

--  
呵呵!我自己做出来了!给大家看看!
  <xsl:template name ="stu">
    <root>
      <xsl:for-each select="//stu">
        <xsl:variable name ="id" select ="sid"/>
        <stu>
          <xsl:copy-of  select ="./*"/>
          <xsl:copy-of select="$temp[sid=$id]/sexamid"/>
        </stu>
      </xsl:for-each>
    </root>
  </xsl:template>
--  作者:Qr
--  发布时间:4/22/2008 12:14:00 PM

--  
我的代码用xsl:apply-templates ,而你的代码用xsl:for-each ,目的都是要遍历stu节点,难道为同一实现,此二法有本质区别吗?

<xsl:apply-templates>元素将模版运用到当前元素(或者是当前元素的子节点)。
<xsl:for-each>元素在每一个指定的节点集中循环。

在我的代码中,除非必须要用xsl:for-each,我都用xsl:apply-templates进行遍历,这样可以把相关代码模块化,甚至重用,多方便,而且结构清晰,不知道为什么很多人总喜欢用xsl:for-each替代xsl:apply-templates。反正我不喜欢,不信大家可以看我的代码,99%都是用xsl:apply-templates,而不用xsl:for-each。我不是说真的不用xsl:for-each,能不用的地方我都不用。


--  作者:belinda_pjm
--  发布时间:4/22/2008 12:29:00 PM

--  
但是我用你的那段代码结果不你所说的结果啊!
--  作者:Qr
--  发布时间:4/22/2008 5:55:00 PM

--  
那我就不清楚为什么了,因为我的测试结果如下图所示。

按此在新窗口浏览图片

我也看不出我的代码有任何问题。如果谁能指出来,我会虚心接受,因为我的的确确只是个非专业的XML FANS。



--  作者:songyz
--  发布时间:5/13/2008 11:51:00 AM

--  
我用了Qr的方法,结果在java里面试的时候,总是出现utf-8编码错误,于是我就把两个xml的编码改成GB2312,xslt文件的编码改成UTF-8就没有问题了,不知道是怎么回事?
--  作者:Qr
--  发布时间:5/13/2008 1:58:00 PM

--  
XML的编码,即encoding要与XML文件保存的编码一致,否则提示:编码错误。
当XML的 encoding=GB2312,文件的编码为:ANSI
当XML的 encoding=UTF-8,文件的编码为:UTF-8

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms