以文本方式查看主题

-  W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  求助:Qr  你还在么,我又把图片上传了 你上去帮我看看  谢谢~!!!  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=75071)


--  作者:wjj0322
--  发布时间:5/26/2009 9:54:00 AM

--  求助:Qr  你还在么,我又把图片上传了 你上去帮我看看  谢谢~!!!
按此在新窗口浏览图片
登陆帐号:wjj0322@126.com 密码:111111

XML文件:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="XSLTFile1.xsl"?>
<survey name = "Example Survey">
  <question type = "text" name = "Name" />
  <question type = "text" name = "Industry" />
  <question type = "radio" name ="Education">
    <choice value = "Junior High School"/>
  <choice value = "High school" />
  <choice value = "University" />
  </question>
  <question type = "dropdownlist" name = "Income">
   <select value = "less than 1000" />
   <select value = "between 1000 and 2000" />
   <select value = "more than 2000" />
  </question>
</survey>


--  作者:Qr
--  发布时间:5/27/2009 3:40:00 PM

--  
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="question[@type='text']">
<xsl:value-of select="@name"/><input type="{@type}"/><br/>
</xsl:template>

<xsl:template match="question[@type='radio']">
<xsl:value-of select="@name"/><xsl:apply-templates/><br/>
</xsl:template>

<xsl:template match="question[@type='dropdownlist']">
<xsl:value-of select="@name"/>
<select name="{@name}"><xsl:value-of select="@name"/><xsl:apply-templates/></select><br/>
</xsl:template>

<xsl:template match="choice">
<input type="{../@type}" name="{../@name}" value="{@value}"/><xsl:value-of select="@value"/><br/>
</xsl:template>

<xsl:template match="select">
<option value="{@value}"/><xsl:value-of select="@value"/><br/>
</xsl:template>
结果:
此主题相关图片如下:
按此在新窗口浏览图片
以上代码纯粹按照你的要求来写,实际上在行数不增加的情况下稍作修改,就可以作为一个通用的代码使用,方便生成HTML中各控件。

PS:本人比较懒,不习惯写注释。另,你的代码要求用<xsl:for-each>,本人不习惯用,除非不得已,一般用xsl:apply-templates。

这两天网络不正常,昨天一天都没能登录BBS,今天上午办公室网络又不正常,呜呼。


--  作者:hexun831012
--  发布时间:5/27/2009 4:01:00 PM

--  
另,你的代码要求用<xsl:for-each>,本人不习惯用,除非不得已,一般用xsl:apply-templates。
同道中人,深知XSL至理,到底是QR
--  作者:Qr
--  发布时间:5/27/2009 5:31:00 PM

--  
看过N多使用XSL模板的网站,全是用<xsl:for-each>,奇怪了,我就不喜欢。用xsl:apply-templates,XSL最牛的元素,用其写的代码结构清晰,易维护,何乐而不为。
--  作者:hexun831012
--  发布时间:5/27/2009 5:34:00 PM

--  
个人感觉,很多人还是不能理解XSL的逻辑,还是用面向过程的语言的思路去写XSL
就像我还是不能适应JAVA一样,有时候还会用惯有的思维去套


--  作者:wjj0322
--  发布时间:5/31/2009 3:41:00 PM

--  
呵呵 谢谢了,我看到了!
这是我到老师那里乘过来的XSLT文件,也做的出来的,和你的不大一样~!
<?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><body>  
    <xsl:for-each select= "survey/question">           
       <xsl:if test="@type ='text'">              
          <P><xsl:value-of select="@name" />: <input type = "text"/></P>
       </xsl:if>
       <xsl:if test="@type ='radio'">
          <P><xsl:value-of select="@name" />: </P>             
          <xsl:for-each select= "./choice">
          <P><input type ="radio" value="Radio1" name="RadioGroup"/><xsl:value-of select="@value" /></P>
          </xsl:for-each>
       </xsl:if>
       <xsl:if test="@type ='dropdownlist'">
          <P><xsl:value-of select="@name" />: <select type="dropdownlist">
          <xsl:for-each select= "./select">  
          <OPTION><xsl:value-of select="@value" /></OPTION>        
          </xsl:for-each>   
          </select></P>
       </xsl:if>
    </xsl:for-each>  
<input id="Button1" type="button" value="Submit"/>
</body></HTML>   
</xsl:template>
</xsl:stylesheet>
--  作者:Qr
--  发布时间:5/31/2009 6:17:00 PM

--  
作为教学还可以,实际应用效率低,维护困难,可移植性差。
--  作者:ioyichen
--  发布时间:6/19/2009 9:42:00 AM

--  
<xsl:for-each> 与计算机的高级编程更加接近,如果是程序员来写的,更加倾向与使用<xsl:for-each>  也比较好解释。而xsl:apply-templates有着其在xslt内有其本身的含义,我就比较喜欢for-each,因为这样控制起来方便,即使不懂xslt的人,对编程有点了解的,一看就明白其中的逻辑!
--  作者:Qr
--  发布时间:6/19/2009 12:25:00 PM

--  
喜欢让步于效率。
xsl:apply-templates作为XSL基本的元素和基本应用,作为一个程序员,如果这个都不能很好理解和应用,舍效率而求喜好,那偶无话可说。
--  作者:ioyichen
--  发布时间:6/19/2009 2:47:00 PM

--  
但别忘了xsl:apply-templates 他的解析规则是有限制的,按顺序逐一,而for-each的可控制性更高啊
--  作者:ioyichen
--  发布时间:6/19/2009 2:59:00 PM

--  
不同的场景用哪个,没有强调一定要用哪个,选更加适合的即可
--  作者:hexun831012
--  发布时间:6/19/2009 4:19:00 PM

--  
那你为什么不在SQL语句里写for循环,有没有见过20+文档组来做Trans,用for-each怎么封装,继承,重写
--  作者:Qr
--  发布时间:6/19/2009 6:28:00 PM

--  
xsl:apply-templates 可控制性不见得差,也许是偶比较熟悉其应用吧。

偶也没有强调非要用xsl:apply-templates而舍弃for-each不可,存在总有其道理。

从XSL编程的角度上讲,xsl:apply-templates效率就是优于for-each,这是XSL的机制所决定的。

封装,继承,重写对于程序员来说是如此的重要。初学的时候,也曾用for-each,但稍微熟悉XSL编程后,偶就放弃了,for-each似乎很符合编程的逻辑,但是,随着代码的增加,缩进处理不好,恐怕你都不愿意去改之前自己写的代码,更别说代码的重用了。xsl:apply-templates可以让偶非常简单的把相类的代码应用到不同需要的编程中,用for-each只能慢慢的去分析和剥离。一句话,xsl:apply-templates更接近于面向对象的编程。

偶不是权威,只是从编程的角度强调xsl:apply-templates在XSL编程中的优越性,没有强迫他人意志的意思。


--  作者:Qr
--  发布时间:6/19/2009 6:37:00 PM

--  
hexun831012的例子很生动。

实际上,熟悉了xsl:apply-templates的应用,你会发现,这其实非常符合编程的逻辑。xsl:apply-templates的应用就好象其它高级语言编程一样,将功能模块化,方便封装,继承,重写,这是偶使用和推崇的重要原因。


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