2011-05-13 58 views
1

我正在为学校创建一个多选题程序。为此,我必须编写一个xslt样式表来显示正确的答案。xslt xpath +多个样式表问题

我的XML具有以下strucure

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE QUIZ SYSTEM "quiz.dtd"> 
<?xml-stylesheet type="text/xsl" href="quizanswers.xsl"?> 
<quiz> 
<multipleChoice solution="3"> 
    <question>Question 1</question> 
    <answer>answer 1</answer> 
    <answer>answer 2</answer> 
    <answer>answer 3</answer> 
    <answer>answer 4</answer> 
</multipleChoice> 
<multipleChoice solution="4"> 
    <question>Question 1</question> 
    <answer>answer 1</answer> 
    <answer>answer 2</answer> 
    <answer>answer 3</answer> 
    <answer>answer 4</answer> 
</multipleChoice> 
</quiz> 

用下面的XSLT文件

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<html> 
<body> 
<h1>Answers</h1> 
<xsl:for-each select="quiz/multipleChoice"> 
<u><br></br><xsl:value-of select="question"/></u><br></br> 
- <xsl:value-of select="question[../multipleChoice/@solution]"/> <br /> 
</xsl:for-each> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

我要的是从问题[解属性]属性解集数。我取得了成就但没有成功。有没有人有解决方案/建议硫问题?

我也想让这个XML文件有多个样式表......这可能吗?

在此先感谢...

+0

刚注意到你的根元素''是小写字母,但你的文档类型声明是大写的('QUIZ')。您应该更改您的文档类型以匹配根元素的大小写。 – 2011-05-13 09:13:37

回答

1

是的,你可以通过将它们包括按如下方式使用多个样式表:

<xsl:include href="mutiple.xsl"/> 

看起来你应该想要的答案,而不是问题吗?所以,你的XSLT应该是这样

最终版本

后从DevNull有用的意见,我同意这是最干净的解决方案

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
     <body> 
      <h1>Answers</h1> 
      <xsl:for-each select="quiz/multipleChoice"> 
       <u> 
        <br></br> 
        <xsl:value-of select="question"/> 
       </u> 
       <br></br> 
       <br /> 
       <xsl:value-of select="answer[number(../@solution)]" /><br /> 
      </xsl:for-each> 
     </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 
+1

我认为这个答案有2个问题。 1)'format-number()'返回一个字符串,所以你不会得到你期望的返回值。 2)您需要从父母(multipleChoice)获得@solution。你'select'应该看起来像这样:'select =“answer [number(../@ solution)]'' – 2011-05-13 08:51:03

+1

更新后的评论:我仍然会使用你的第一个样式表并修改你的'select'。它比创建变量imo更清洁。 – 2011-05-13 08:54:19

+0

+1最终版本:-) – 2011-05-13 09:07:39

1

试试这个:

<xsl:template match="/"> 
    <html> 
    <body> 
     <h1>Answers</h1> 
     <xsl:apply-templates /> 
    </body> 
    </html> 
</xsl:template> 

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

<xsl:template match="answer" /> 

<xsl:template match="answer[position() = ../@solution]"> 
    <xsl:text>- </xsl:text> 
    <xsl:apply-templates /> 
    <br /> 
</xsl:template> 

最后两个模板忽略所有答案,除了回答节点的位置(仅限回答节点之间)等于它的父项的@solution属性。

+0

+1推式。 – 2011-05-13 09:28:08