以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  请教xsl:copy的中英文标识问题[求助]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=74340)


--  作者:wuqq.xml
--  发布时间:4/19/2009 10:23:00 AM

--  请教xsl:copy的中英文标识问题[求助]
附件是在XML实验课上遇到的问题,简历的显示都正确,除了QQ这个标签。在show.xsl中可以匹配到QQ这个标记,但<xsl:copy/>无法显示,其它的都正确。
如果在QQ前面加一个中文,如:我QQ作为标记,则会显示正确,不知道为啥?
请大侠帮忙看看。
具体代码见附件。
谢了


--  作者:hexun831012
--  发布时间:4/21/2009 8:17:00 PM

--  
请将代码贴上来
--  作者:wuqq.xml
--  发布时间:4/21/2009 8:53:00 PM

--  
XML数据文件:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet href="show.xsl" type="text/xsl" ?>
<个人简历表>
  <基本信息1>
 <姓名>张三</姓名>
 <性别>男</性别>
 <民族>汉</民族>
 <出生年月>1989年09月15号</出生年月>

  </基本信息1>

  <基本信息2>
 <身高 >175cm</身高>
 <体重>58公斤</体重>
 <政治面貌>团员</政治面貌>
 <籍贯>福建</籍贯>
  </基本信息2>

  <联系方式>
 <邮件>zhang3@126.com</邮件>
 <QQ>87085***</QQ>
 <手机号>1589202****</手机号>
 <固话>0591-6288***</固话>
  </联系方式>

  <学籍信息>
 <专业>软件工程</专业>
 <学历>本科</学历>
        <毕业院校>厦门大学</毕业院校> 
  </学籍信息>

  <其他综合信息>
  <学习经历>
   小学。。。。。。
   初中。。。。。。
   高中。。。。。。
  </学习经历>

  <获奖情况>
   一好。。。。。。
   二好。。。。。。
   三好。。。。。。
  </获奖情况>

  <兴趣爱好>
   吃。。。。。。
   喝。。。。。。
   玩。。。。。。
   学。。。。。。
  </兴趣爱好>

  <个人特长>
   一无。。。。。。
   二无。。。。。。
   三无。。。。。。 
  </个人特长>
  

  </其他综合信息>
  <个人空间>My QQ Space-URL:http://user.qzone.qq.com/870adfadf8/infocenter</个人空间>

</个人简历表>

XSL文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<html>
 
 <table border="1">
<caption>
个人简历表
</caption>

 <tr>
   <xsl:apply-templates select="个人简历表/基本信息1/*" />
<th rowspan="4" width="100"> <img src="2.jpg"/> </th>
 </tr>
 

 <tr>
   <xsl:apply-templates select="个人简历表/基本信息2/*" />
 </tr>

 <tr>
   <xsl:apply-templates select="个人简历表/联系方式/*" />
 </tr>

 <tr>
   <xsl:apply-templates select="个人简历表/学籍信息/*" />
 </tr>


 <tr>
   <xsl:apply-templates select="个人简历表/其他综合信息/学习经历" />
 </tr>

 <tr>
   <xsl:apply-templates select="个人简历表/其他综合信息/获奖情况" />
 </tr>

 <tr>
   <xsl:apply-templates select="个人简历表/其他综合信息/兴趣爱好" />
 </tr>

 <tr>
   <xsl:apply-templates select="个人简历表/其他综合信息/个人特长" />
 </tr>

 <tr>
   <xsl:apply-templates select="个人简历表/个人空间" />
 </tr>
<tr>

<td colspan="9"  width="400">
<img src="1.jpg"/>

</td>
</tr>
 </table>
</html>
</xsl:template>

<xsl:template match="//姓名|性别|民族|出生年月">
<th>
<xsl:copy/>
</th>

<td>
<font size="4">
    <xsl:value-of select="." />
</font>
</td>
</xsl:template>

<xsl:template match="//身高|体重|政治面貌|籍贯">
<th>
<xsl:copy/>
</th>

<td>
<font size="4">
    <xsl:value-of select="." />
</font>
</td>
</xsl:template>

<xsl:template match="//固话|邮件|QQ|手机号">
<th><!--这里QQ的标记可以匹配到,但无法在浏览器中显示-->
<xsl:copy/>
</th>

<td>
<font size="4">
    <xsl:value-of select="." />
</font>
</td>
</xsl:template>
  
<xsl:template match="//专业|学历">
<th>
<xsl:copy/>
</th>

<td>
<font size="4">
    <xsl:value-of select="." />
</font>
</td>
</xsl:template>   

<xsl:template match="//毕业院校">
<th>
<xsl:copy/>
</th>

<td colspan="3" align="center">
<font size="4">
    <xsl:value-of select="." />
</font>
</td>
</xsl:template>   

<xsl:template match="//学习经历|获奖情况|兴趣爱好|个人特长">
<th>
<xsl:copy/>
</th>
<td colspan="8">
<font size="4">
    <xsl:value-of select="." />
</font>
</td>
</xsl:template>

<xsl:template match="个人空间">
<th>
<xsl:copy/>
</th>

<td colspan="8">
<font size="4">
  <xsl:value-of select="." />
</font>
</td>
</xsl:template>  
</xsl:stylesheet>


--  作者:wuqq.xml
--  发布时间:4/21/2009 8:55:00 PM

--  
问题在:

<xsl:template match="//固话|邮件|QQ|手机号">
<th><!--这里QQ的标记可以匹配到,但无法在浏览器中显示-->
<xsl:copy/>
</th>

<td>
<font size="4">
    <xsl:value-of select="." />
</font>
</td>
</xsl:template>


--  作者:hexun831012
--  发布时间:4/25/2009 3:28:00 PM

--  
看来你不怎么懂Xpath
--  作者:hexun831012
--  发布时间:4/26/2009 10:54:00 PM

--  
你要的实现应该是用<xsl:copy select="node()"/>吧
--  作者:wuqq.xml
--  发布时间:4/27/2009 9:31:00 AM

--  
效果相当。。
<xsl:copy select="node()"/>需要用另外一个xmlns:xsl值
现在程序的内容、显示都可以,除了QQ标记(就是中英文的问题)
我试过编码等,都无法解决。。

--  作者:hexun831012
--  发布时间:4/28/2009 6:37:00 PM

--  
<xsl:template match="//固话|邮件|QQ|手机号">
<th><!--这里QQ的标记可以匹配到,但无法在浏览器中显示-->
<xsl:copy/>
</th>

<td>
<font size="4">
    <xsl:value-of select="." />
</font>
</td>
</xsl:template>
你这个Xpath能匹配到吗,我有点怀疑
你这个匹配的是任意固话或当前邮件子节点或当前QQ子节点或当前手机号子节点
所以我说你的Xpath有问题,全文的Xpath写的都相当业余,可能是楼主对XSL的逻辑不太理解,这也是正常的,呵呵


--  作者:wuqq.xml
--  发布时间:4/28/2009 8:35:00 PM

--  
可以匹配,我测试过了。 我在<xsl:copy/>后面加上<xsl:copy/>ABC,ABC这个信息可以在结果中显示。因此匹配肯定是没问题的。
<xsl:template match="//固话|邮件|QQ|手机号">
<th><!--这里QQ的标记可以匹配到,但无法在浏览器中显示-->
<xsl:copy/>ABC
</th>

<td>
<font size="4">
    <xsl:value-of select="." />
</font>
</td>
</xsl:template>


另外,额外话题,为什么这个论坛各位大侠在回答问题的时候老是说“你不懂XXX",”相当业余“等等打击人的话呢,有问题说问题啊。。。这个文档是一个刚接触XML文件的学生写的,我觉得已经非常不错了,在一个实验课时时间内能做成这样。


--  作者:Qr
--  发布时间:4/28/2009 9:55:00 PM

--  
以下用法,都是正确的:
<xsl:copy/>

<xsl:copy-of select="node()"/>

<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>

但是,<xsl:copy/>这种应用必须比较熟悉XSL和XPath的应用,否则哪出错了都不懂。

至于你的代码,<xsl:copy>的用法正确与否,我没有进行测试,不过有一点可以确定:
以上三种方法,返回格式类似<b><QQ>12345678</QQ></b>这种包含非HTML标签代码,在HTML中,都无法直接显示,不信你把它复制到HTML页面试试,可以看到粗体的12345678,但同样无法看到<QQ>标记,包含中文就可以,这就是你问题的关键。

另,XML论坛各位上各位版主都是比较热情和有责任心的,hexun831012的话也没错,只是他的个性比较直接而已。


--  作者:wuqq.xml
--  发布时间:4/28/2009 10:36:00 PM

--  
谢了
--  作者:hexun831012
--  发布时间:4/28/2009 10:39:00 PM

--  
呵呵,打击你了吗,也可以说是激励
第一,你的文档逻辑相当混乱,你的文档换一个结构,转换出来的都差不多,这就出现了逻辑的二义性,第二,大量使用//,不但性能低下,而且一旦出现重名,那必然出现转换错误,你的文档很简单,但在当今的应用系统中,为了系统结构性和维护性,一个转换都是有几十个文档的超空间文档组来完成,所以~~~
在这里还是有必要解释一下XSL的逻辑,这个是很多新人很难入手的门槛,XSL的逻辑不是赋值,而是匹配,入口是文档,而非根节点,从文档出发,遍历其所有子节点(节点并不是元素,而包括元素,属性,批注,PI,文本...),然后从XSL文档自下而上的寻找第一个匹配的模版进行转换,在模版中可以直接输出内容,也可以在此执行一个匹配,也就是(apply-templates),过程会再一次自下而上的寻找第一个匹配的模版进行转换,以此类推,如果没有匹配的模版,系统会调用默认模版(默认模版是通过顶部隐藏模版实现的),你的文档除了/模版以外,其他模版都极易被误匹配,
我仔细的看了一下,至于你问题,还是错在<xsl:copy/>,这样写才对
<xsl:template match="固话|邮件|QQ|手机号">
<th><!--这里QQ的标记可以匹配到,但无法在浏览器中显示-->
  <xsl:value-of select="name()"/>
</th>
<td>
<font size="4">
    <xsl:value-of select="." />
</font>
</td>
</xsl:template>
<xsl:copy/>输出的是<qq><qq/>而并非是QQ这个标签名,至于中文为什么能输出,这本身是IE的一个BUG,或者说是让步,在标准的解析器里,连中文都显示不出来,比如firefox
我建议你以后这么些这样的模版
<xsl:template match="个人简历表">
    <!--...-->
    <table border="1">
      <xsl:apply-templates select="联系方式"/>
    </table>
    <!--...-->
  </xsl:template>
  <xsl:template match="联系方式">
    <!--...-->
    <tr>
      <xsl:apply-templates/>
    </tr>
    <!--...-->
  </xsl:template>
  <xsl:template match="//固话|邮件|QQ|手机号">
    <th>
      <xsl:value-of select="name()"/>
    </th>
    <td>
      <font size="4">
        <xsl:value-of select="." />
      </font>
    </td>
  </xsl:template>
也许我说话打击了你,不好意思,有时候没时间细细看每个帖子,所以大致给个评论,不过还是希望你日后学习工作不要以最基本的实现为目标,而要着眼于标准(包括你输出的HTML,很不标准),这样你才有竞争力,这才是我们论坛的目标和宗旨--标准!



--  作者:hexun831012
--  发布时间:4/28/2009 10:45:00 PM

--  
以下是引用Qr在2009-4-28 21:55:00的发言:
以下用法,都是正确的:
<xsl:copy/>

<xsl:copy-of select="node()"/>

<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>

但是,<xsl:copy/>这种应用必须比较熟悉XSL和XPath的应用,否则哪出错了都不懂。

至于你的代码,<xsl:copy>的用法正确与否,我没有进行测试,不过有一点可以确定:
以上三种方法,返回格式类似<b><QQ>12345678</QQ></b>这种包含非HTML标签代码,在HTML中,都无法直接显示,不信你把它复制到HTML页面试试,可以看到粗体的12345678,但同样无法看到<QQ>标记,包含中文就可以,这就是你问题的关键。

另,XML论坛各位上各位版主都是比较热情和有责任心的,hexun831012的话也没错,只是他的个性比较直接而已。



直接,这个措词,哈哈哈
--  作者:Qr
--  发布时间:4/28/2009 10:53:00 PM

--  
所以说,学精XSL还是有相当难度的,另外还有XPath,掌握了它,写XSL就会更得心应手。

IE很“宽容”,但是这种“宽容”却非常容易偏离标准,后果是可想而知的,所以,学好用好标准,才是根本。


--  作者:wuqq.xml
--  发布时间:4/28/2009 10:54:00 PM

--  
谢了。

--  作者:hexun831012
--  发布时间:4/28/2009 10:57:00 PM

--  
所以还是那句话,学术的时候请用标准+Firefox,工作的时候请用标准+兼容


--  作者:Qr
--  发布时间:4/28/2009 10:59:00 PM

--  
以下是引用hexun831012在2009-4-28 22:45:00的发言:
直接,这个措词,哈哈哈


晕,原打“耿直”,因为输入法的问题,输出“耿直接”,然后又删错了“耿”字,看来是该睡觉了。

--  作者:hexun831012
--  发布时间:4/28/2009 11:01:00 PM

--  
5月12号我就出发去澳洲了,以后基本看不懂中文啦,活活
--  作者:Qr
--  发布时间:4/28/2009 11:27:00 PM

--  
以下是引用hexun831012在2009-4-28 23:01:00的发言:
5月12号我就出发去澳洲了,以后基本看不懂中文啦,活活


陆克文上任,澳洲人开始学习中文;你刚准备去澳洲,就忘了中文,是不是有点……
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
99.609ms