以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  [求助]如何在XSL里多次动态查询  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=19260)


--  作者:tianly
--  发布时间:6/5/2005 9:37:00 PM

--  [求助]如何在XSL里多次动态查询
我是第一次接触XML,要做一个从题库里动态选题的网页,用的是XML+XSL。我也看到网上有个动态查询的例子,于是我照着也做了一个,成功了。可是没想到到我多次调用它时,就怎么也选不上了,而且我发现单词选的节点跟多次选的都不一样,请问高手,如何才能完成多次查询。
我的XML如下:(exam2.xml)
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet type='text/xsl' href='exam2.xsl'?>
 <!-- File name: exam2.xml -->

<examcontent>
 <question type="0" seq="1">
  <text>软件工程是从</text>
  <editbox id="1" mark="1">管理</editbox>
  <text>和</text>
  <editbox id="2" mark="1">技术</editbox>
  <text>两个方面研究如何更好的开发和维护计算机软件的一门学科。</text>
 </question>
 <question type="0" seq="2">
  <text>软件开发技术包括软件开发方法学、</text>
  <editbox id="3" mark="1">软件工具</editbox>
  <text>和</text>
  <editbox id="4" mark="1">软件开发环境</editbox>
  <text>。</text>
 </question>
 <question type="0" seq="3">
  <text>优秀的设计通常是从现有的物理系统出发,导出现有系统的</text>
  <editbox id="5" mark="1">高层逻辑模型</editbox>
  <text>。</text>
  </question>
 <question type="0" seq="4">
  <text>结构化分析方法使用数据流图DFD和</text>
  <editbox id="6" mark="1">数据字典DD</editbox>
  <text>来描述。</text>
 </question>
 <question type="0" seq="5">
  <text>在分层的数据流图中,称上层图为下层图的</text>
  <editbox id="7" mark="1">父图</editbox>
  <text>,下层图为上层图的</text>
  <editbox id="8" mark="1">子图</editbox>
  <text>。</text>
 </question>
 <question type="0" seq="6">
  <text>模块间的耦合程度强烈影响系统的可理解性、</text>
  <editbox id="9" mark="1">可测试性</editbox>
  <text>、可靠性和</text>
  <editbox id="10" mark="1">可维护性</editbox>
  <text>。</text>
 </question>
 <question type="0" seq="7">
  <text>Jackson图既可用表达程序结构,也可用表达</text>
  <editbox id="11" mark="1">数据结构</editbox>
  <text>。</text>
 </question>
 <question type="0" seq="8">
  <text>程序的控制结构一般采用</text>
  <editbox id="12" mark="1">顺序</editbox>
  <text>、</text>
  <editbox id="13" mark="1">选择</editbox>
  <text>、</text>
  <editbox id="14" mark="1">循环</editbox>
  <text>三种构成,这样可确保结构比较简单。</text>
 </question>
 <question type="0" seq="9">
  <text>面向对象的软件工程方法是面向对象方法在软件:工程领域的全面运用。它包括面向对象的分析、</text>
  <editbox id="15" mark="1">面向对象的设计</editbox>
  <text>、</text>
  <editbox id="16" mark="1">面向对象的编程</editbox>
  <text>、面向对象的测试和</text>
  <editbox id="17" mark="1">面向对象的软件维护</editbox>
  <text>等主要内容。</text>
 </question>
 <question type="0" seq="10">
  <text>标准建模语言UML的重要内容可以通过</text>
  <editbox id="18" mark="1">用例图</editbox>
  <text>、</text>
  <editbox id="19" mark="1">静态图</editbox>
  <text>、行为图、</text>
  <editbox id="20" mark="1">交互图</editbox>
  <text>和实现图等图来定义。</text>
 </question>
 <question type="0" seq="11">
  <text>程序的效率是指</text>
  <editbox id="21" mark="1">程序的执行速度</editbox>
  <text>和</text>
  <editbox id="22" mark="1">程序占用的存储空间</editbox>
  <text>。</text>
 </question>
 <question type="0" seq="12">
  <text>实现容错的主要手段是冗余和</text>
  <editbox id="23" mark="1">防错程序设计</editbox>
  <text>。</text>
 </question>
 <question type="0" seq="13">
  <text>为了保证软件的质量,在软件开发过程中经常采取</text>
  <editbox id="24" mark="1">审查</editbox>
  <text>、复查和管理复查</text>
  <editbox id="25" mark="1">测试</editbox>
  <text>等措施。</text>
 </question>
 <question type="1" seq="1001">
  <text>下列关于瀑布模型的描述正确的是(    )。</text>
  <schoice id="1" value="A">利用瀑布模型,如果发现问题修改的代价很低</schoice>
  <schoice id="1" value="B">瀑布模型的核心是按照软件开发的时间顺序将问题简化</schoice>
  <schoice id="1" value="C">瀑布模型具有良好的灵活性</schoice>
  <schoice id="1" value="D">瀑布模型采用结构化的分析与设计方法,将逻辑实现与物理实现分开</schoice>
  <answer id="1" mark="2">D</answer>
 </question>
 <question type="1" seq="1002">
  <text>总体设计的目的是确定整个系统的(    )。</text>
  <schoice id="2" value="A">规模</schoice>
  <schoice id="2" value="B">功能及模块结构</schoice>
  <schoice id="2" value="C">费用</schoice>
  <schoice id="2" value="D">测试方案</schoice>
  <answer id="2" mark="2">B</answer>
 </question>
 <question type="1" seq="1003">
  <text>下列哪个图不是N—S图的构件(    )。</text>
  <schoice id="3" value="A" />
  <img>cloudy.gif</img>
  <schoice id="3" value="B" />
  <img>rain.gif</img>
  <schoice id="3" value="C" />
  <img>snow.gif</img>
  <schoice id="3" value="D" />
  <img>sunny.gif</img>
  <answer id="3" mark="2">C</answer>
 </question>
 <question type="1" seq="1004">
  <text>下列各方法中(    )不是软件测试方法。</text>
  <schoice id="4" value="A">白盒法</schoice>
  <schoice id="4" value="B">黑盒法</schoice>
  <schoice id="4" value="C">动态测试</schoice>
  <schoice id="4" value="D">盒法</schoice>
  <answer id="4" mark="2">D</answer>
 </question>
 <question type="1" seq="1005">
  <text>如果某种内聚要求一个模块中包含的任务必须在同一段时间内执行,则这种内聚为(    )。</text>
  <schoice id="5" value="A">时间内聚</schoice>
  <schoice id="5" value="B">逻辑内聚</schoice>
  <schoice id="5" value="C">通信内聚</schoice>
  <schoice id="5" value="D">信息内聚</schoice>
  <answer id="5" mark="2">A</answer>
 </question>
 <question type="2" seq="2001">
  <text mark="2">(    )可以作为模块。</text>
  <mchoice id="1" value="A" answer="1">过程</mchoice>
  <mchoice id="1" value="B" answer="1">子程序</mchoice>
  <mchoice id="1" value="C" answer="1">函数</mchoice>
  <mchoice id="1" value="D" answer="1">宏</mchoice>
 </question>
 <question type="2" seq="2002">
  <text mark="2">关于软件测试,正确的描述包括(    )。</text>
  <mchoice id="2" value="A" answer="1">测试前要认定被测试的软件有错</mchoice>
  <mchoice id="2" value="B" answer="1">要尽量避免测试自己编写的程序</mchoice>
  <mchoice id="2" value="C" answer="1">测试要兼顾合理输人与不合理输人数据</mchoice>
  <mchoice id="2" value="D" answer="1">测试是相对的,不能穷尽所有的测试,要据人力物力安排测试,选择好测试用例与 测试方法。</mchoice>
 </question>
 <question type="2" seq="2003">
  <text mark="2">下列(    )属于主动式防错程序设计。</text>
  <mchoice id="3" value="A" answer="1">栈的深度是否合适</mchoice>
  <mchoice id="3" value="B" answer="0">内存检查</mchoice>
  <mchoice id="3" value="C" answer="1">数组界限是否正确</mchoice>
  <mchoice id="3" value="D" answer="0">时间检查</mchoice>
 </question>
 <question type="2" seq="2004">
  <text mark="2">下列(    )属于判定覆盖。</text>
  <mchoice id="4" value="A" answer="0">每个语句都被执行</mchoice>
  <mchoice id="4" value="B" answer="1">选择的测试数据必须足够多</mchoice>
  <mchoice id="4" value="C" answer="0">每个判定的每种可能的结果都被执行</mchoice>
  <mchoice id="4" value="D" answer="1">判定表达式中的每个条件都取到可能的值</mchoice>
 </question>
 <question type="2" seq="2005">
  <text mark="2">软件管理工作涉及到的直接对象包括(    )。</text>
  <mchoice id="5" value="A" answer="1">软件开发人员</mchoice>
  <mchoice id="5" value="B" answer="0">硬件设备</mchoice>
  <mchoice id="5" value="C" answer="1">项目经费</mchoice>
  <mchoice id="5" value="D" answer="1">软件项目</mchoice>
 </question>
 <question type="3" seq="3001">
  <text>对于软件项目,投资回收期越长,越快获得利润。</text>
  <yesno id="1" mark="2">0</yesno>
 </question>
 <question type="3" seq="3002">
  <text>一个实时系统必须在严格的时间范围内响应。如果响应时间被过分延迟,将带来灾难性的后果。</text>
  <yesno id="2" mark="2">1</yesno>
 </question>
 <question type="3" seq="3003">
  <text>模块接口简单是软件发生错误的一个主要原因。</text>
  <yesno id="3" mark="2">0</yesno>
 </question>
 <question type="3" seq="3004">
  <text>软件的质量保证工作一般在编码工作结束后才开始。</text>
  <yesno id="4" mark="2">0</yesno>
 </question>
 <question type="3" seq="3005">
  <text>现在人们普遍认为优秀的程序除了功能正确,性能优良之外,还应该容易看懂、容易使用、容易修改和扩充。</text>
  <yesno id="5" mark="2">1</yesno>
 </question>
 <question type="4" seq="4001">
  <text>软件产品具有哪些特性?</text>
  <requirement>本题10分</requirement>
  <qtextarea id="1" mark="10">①软件是一种逻辑实体,而不是具体的物理实体,因而它具有抽象性。②软件是通过人们的智力活动,把知识与技术转化成信息的一种产品,是在研制、开发中被创造出来的。③在软件的运行和使用期间,没有硬件那样的机械磨损、老化问题。④软件的开发和运行经常受到计算机系统的限制,对计算机系统有着不同程度的依赖性。⑤软件的开发至今尚未完全摆脱手工的开发方式。⑥软件的开发费用越来越高,成本相当昂贵。</qtextarea>
 </question>
 <question type="4" seq="4002">
  <text>什么是耦合?什么是内聚?</text>
  <requirement>本题4分</requirement>
  <qtextarea id="2" mark="4">内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。</qtextarea>
 </question>
 <question type="4" seq="4003">
  <text>为什么软件测试不应该由程序的编写人员来做?</text>
  <requirement>本题7分</requirement>
  <qtextarea id="3" mark="7">正确认识测试的目标是十分重要的,测试目标决定了测试力案的设计。如果为了表明程序是正确的而进行测试,就会设计一些不易暴露错误的测试方案;相反,如果测试是为了发现程序中的错误,就会力求设计出最能暴露错误的测试方案。由于测试的目标是暴露程序中的错误,从心理学角度看,由程序的编写者自己进行测试是不恰当的。</qtextarea>
 </question>
 <question type="4" seq="4004">
  <text>什么是编码风格?为什么要强调编码风格?</text>
  <requirement>本题7分</requirement>
  <qtextarea id="4" mark="7">编码的目标从强调效率转变为强调清晰。良好的编码风格能在一定程度上弥补语言存在的缺陷,而如果不注意风格就很难写出高质量的程序。尤其当多个程序员合作编写一个很大的程序时,需要强凋良好而一致的编码风格,以便相互通讯,减少因不协调而引起的问题。总之,良好的编码风格有助于编写出可靠而又容易维护的程序,编码的风格在很大程度上决定着程序的质量。</qtextarea>
 </question>
 <question type="5" seq="5001">
  <text>根据下列N—S图,写出其对应的伪码。</text>
  <requirement>本题10分</requirement>
  <img>cloudy.gif</img>
  <atextarea id="5" mark="10">  Start
  a
  b
  Do Until x6
     If xl then
        f
        If x4 then
         Do Until x5
          i
         End Until
      Else
         g
         h
      End if
    Else
       Select Case x2
          Case 1:
           Do While x3
             c
            End While
       Case 2:
        d
       Case 3:
        e
     End Select
  End if
End. Until
Stop</atextarea>
 </question>
 <question type="5" seq="5002">
  <text id="6">根据下列描述,画出教材征订系统的第一层数据流图。学生入学后到教材科订书,教材科根据教材库存情况分析是否需要买书,如需购买,则向书店购买。各种资金往来通过学校的会计科办理。</text>
  <requirement>本题7分</requirement>
  <atextarea id="6" mark="7">
   <img>cloudy.gif</img>
  </atextarea>
 </question>
</examcontent>
xsl文件:(exam2.xsl)
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" version="1.0">

<xsl:template match="/">
<script>
function getRange(x)
{
 var objExamContent = new ActiveXObject("Microsoft.XMLDOM");
 objExamContent.load("exam2.xml");
 var objExam = objExamContent.selectNodes("/examcontent/question[@type=" + x + "]");
 var value = objExam.length;
 return value;
}
function searchtext(x, value, nbr)
{
 var myValue = Math.floor((value * Math.random()) + 1);
 var id = myValue+x*1000;
 
stylesheet=document.XSLDocument;
source=document.XMLDocument;
sortField=document.XSLDocument.selectNodes("//@select");
[color=#FF0000]alert(sortField[1].text);[/color]
sortField[1].value="question[@seq='"+id+"']";
[color=#FF0000]alert(sortField[1].text);[/color]

 if (nbr == 0)
  type0.innerHTML=source.documentElement.transformNode(stylesheet);
 if (nbr == 1)
  type1.innerHTML=source.documentElement.transformNode(stylesheet);
}
</script>
<HTML>
<HEAD><TITLE>试卷</TITLE></HEAD>
 <BODY background="admin.gif" bgproperties="fixed">
<div align="center">
 <H1>试卷代号:2073 </H1>
 中央广播电视大学2003—2004学年度第二学期“开放专科”期末考试<br/>
 计算机专业  软件工程  试题<br/>
</div>
<div align="right">
  <script language="javascript">document.write(document.lastModified)</script><br/>
</div>
<form action="url" method="POST">

<div align="left">
 一.填空题 (在横线上填写正确的答案,每空1分)<br/>
 <script>var value=getRange(0);</script>
 1.
 <div id="type1" name="type1">
  <xsl:apply-templates select="examcontent" />
 </div>
 <script>searchtext(0, value, 1);</script>
 2.
 二.单项选择题 (将一个正确的答案代码填入括号中,每小题2分)<br/>
 <script>var value=getRange(1);</script>
 1.
 <div id="type0" name="type0">
  <xsl:apply-templates select="examcontent" />
 </div>
 <script>searchtext(1, value, 0);</script>
 2.
</div>
<table align="center" width="30%" cellspacing="1" cellpadding="2" border="0">
 <tr>
  <td width="50%"><div align="center"><input type="Submit" value="Submit" name="Submit" /></div></td>
  <td width="50%"><div align="center"><input type="Reset" value="Reset" name="Reset" /></div></td>
 </tr>
</table>
</form>
</BODY>
</HTML>
</xsl:template>

<xsl:template match="examcontent">
 <xsl:for-each select="question">
 <xsl:value-of select="@id" />
  <xsl:for-each select="*">
      <xsl:choose>
      <xsl:when test="context()[nodeName()$eq$'text']">
        <xsl:apply-templates select="." />
      </xsl:when>
      <xsl:when test="context()[nodeName()$eq$'requirement']">
        <xsl:apply-templates select="." />
       </xsl:when>
      <xsl:when test="context()[nodeName()$eq$'img']">
       <xsl:apply-templates select="." />
      </xsl:when>
      <xsl:when test="context()[nodeName()$eq$'editbox']">
       <xsl:apply-templates select="." />
       </xsl:when>
      <xsl:when test="context()[nodeName()$eq$'schoice']">
       <xsl:apply-templates select="." />
      </xsl:when>
      <xsl:when test="context()[nodeName()$eq$'mchoice']">
       <xsl:apply-templates select="." />
       </xsl:when>
      <xsl:when test="context()[nodeName()$eq$'yesno']">
       <xsl:apply-templates select="." />
      </xsl:when>
      <xsl:when test="context()[nodeName()$eq$'qtextarea']">
       <xsl:apply-templates select="." />
       </xsl:when>
      <xsl:when test="context()[nodeName()$eq$'atextarea']">
       <xsl:apply-templates select="." />
      </xsl:when>
     </xsl:choose>
    </xsl:for-each>
 </xsl:for-each>
</xsl:template>

<xsl:template match="requirement">
 (<xsl:value-of select="." />)
</xsl:template>

<xsl:template match="text">
 <xsl:value-of select="." />
</xsl:template>

<xsl:template match="img">
 <br/>
 <xsl:element name="img">
   <xsl:attribute name="src"><xsl:value-of select="."/></xsl:attribute>
 </xsl:element>
</xsl:template>

<xsl:template match="editbox">
 <xsl:element name="input">
   <xsl:attribute name="type">text</xsl:attribute>
   <xsl:attribute name="name">editbox<xsl:value-of select="@id"/></xsl:attribute>
 </xsl:element>
</xsl:template>

<xsl:template match="schoice">
 <br/>
 <xsl:element name="input">
   <xsl:attribute name="type">radio</xsl:attribute>
   <xsl:attribute name="name">schoice<xsl:value-of select="@id"/></xsl:attribute>
   <xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
 </xsl:element>
 <xsl:value-of select="@value" />.
 <xsl:value-of select="text()" />
</xsl:template>

<xsl:template match="mchoice">
 <br/>
 <xsl:element name="input">
   <xsl:attribute name="type">checkbox</xsl:attribute>
   <xsl:attribute name="name">mchoice<xsl:value-of select="@id"/></xsl:attribute>
   <xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
 </xsl:element>
 <xsl:value-of select="@value" />.<xsl:value-of select="." />
</xsl:template>

<xsl:template match="yesno">
 <xsl:element name="input">
   <xsl:attribute name="type">checkbox</xsl:attribute>
   <xsl:attribute name="name">yesno<xsl:value-of select="@id"/></xsl:attribute>
 </xsl:element>
 <br/>
</xsl:template>

<xsl:template match="qtextarea|atextarea">
 <br/>
  <xsl:element name="textarea">
   <xsl:attribute name="name"><xsl:node-name /><xsl:value-of select="@id"/></xsl:attribute>
   <xsl:attribute name="row">16</xsl:attribute>
   <xsl:attribute name="cols">64</xsl:attribute>
 </xsl:element>
 <xsl:element name='/textarea' />
</xsl:template>

</xsl:stylesheet>
大家可以看到,我调了两次searchtext,同时我在searchtext里用alert显示sortField[1].text。奇怪的是,当我只调用一次searchtext时,我第一次弹出来的值是question,第二次是question[@seq='随机值'],显示结果也是选中的那道题。可是当我需要调用两次searchtext时,第一次弹出来的值是exam,第二次是question[@seq='随机值1'],第三次跟第二次一模一样,第四次是question[@seq='随机值2'],而结果是所有的XML里的内容全部显示出来。
还有个问题是,我需要家题目的序列号。一般而言,序列号应该跟题目是一行的。可我这里,序列号怎么都是跟题目上下行,也请哪为高手之间一二!

郁闷之极,期待解惑!
谢谢,谢谢!


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