2011-05-13 57 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