2015-05-22 7 views
2

Я пытаюсь напечатать среднее значение с xslt и с трудом пытаюсь выяснить способ. У меня есть ответы в отдельном узле и вопросы в отдельном узле. Нужно, чтобы соответствовать вопрос идентификатор с ответом и вычислить среднееРассчитать среднее значение с xslt

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="test.xsl"?> 
    <details> 
    <detail> 
     <answersall> 
     <answers> 
      <question id="1"/> 
      <answer>4</answer> 
      <note>test</note> 
     </answers> 
     <answers> 
     <question id="2"/> 
     <answer>2</answer> 
     </answers> 
     <answers> 
     <question id="3"/> 
     <answer>2</answer> 
     </answers> 
     <answers> 
     <question id="4"/> 
     <answer>3</answer> 
     </answers> 
    </answerall> 
    </detail> 
    <questions> 
    <question id="1" text="Hello how are you" section="a"/> 
    <question id="2" text="how was your day" section="a"/> 
    <question id="3" text="it was good" section="b"/> 
    <question id="4" text="take care" section="b"/> 
    </questions> 
</details> 

Я пытаюсь напечатать что-то вроде этого
Question Answer
Section A 3 (average)
1. Hello how are you 4
2.How was your day 2
Section B 2.5
3. It was good 2
4. Take Care 3

У меня есть часть для печати вопросов и ответов, но не в среднем. Я знаю, что не могу использовать переменную внутри цикла for.

Ниже мой xslt.

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <html> 
    <body> 
     <h2><center>Details</center></h2> 
     <table> 
     <tr> 
      <td>Section A</td> 
      <td>????</td> 
     </tr> 
     <xsl:for-each select="details/questions/question[@section='a']"> 
      <xsl:variable name="id" select="@id"/> 
      <tr> 
       <td><xsl:value-of select="@text"/></td> 
       <td><xsl:value-of select="//answers[question/@id=$id]/answer"/></td> 
      </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
</html> 

+0

В принципе, это * группировка * вопрос. См. Http://www.jenitennison.com/xslt/grouping/muenchian.html и многочисленные примеры здесь на SO. - Обратите также внимание: ваш XML не является корректным, и XSLT, который вы показываете нам, использует неопределенную переменную. –

+0

Я смотрю на этот пример. http://stackoverflow.com/questions/16222647/get-the-average-of-elements-values-in-xsl. Но я не могу понять, как указать на выбор вопроса на основе раздела и найти среднее значение в отдельном узле – user4925190

+0

обновил мой xslt! – user4925190

ответ

2

Вот то, что вы могли бы использовать в качестве отправной точки:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="question-by-section" match="question" use="@section" /> 
<xsl:key name="answer-by-question" match="answers" use="question/@id" /> 

<xsl:template match="/"> 
    <table border="1"> 
     <tr> 
      <th>Question</th> 
      <th>Answer</th> 
     </tr> 
     <xsl:call-template name="generate-section">  
      <xsl:with-param name="section">a</xsl:with-param> 
     </xsl:call-template> 
     <xsl:call-template name="generate-section">  
      <xsl:with-param name="section">b</xsl:with-param> 
     </xsl:call-template> 
    </table> 
</xsl:template> 

<xsl:template name="generate-section"> 
    <xsl:param name="section"/> 
    <xsl:variable name="questions" select="key('question-by-section', $section)" /> 
    <xsl:variable name="answers" select="key('answer-by-question', $questions/@id)" /> 
    <tr> 
     <th> 
      <xsl:value-of select="concat('Section ', $section)" /> 
     </th> 
     <th> 
      <xsl:value-of select="sum($answers/answer) div count($answers)" />   
     </th> 
    </tr> 
    <xsl:for-each select="$questions"> 
     <tr> 
      <td><xsl:value-of select="@text"/></td> 
      <td><xsl:value-of select="key('answer-by-question', @id)/answer"/></td> 
     </tr> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

Прикладного на свой вход (после коррекции answersall против answerall рассогласования!), результат будет выглядеть так:

enter image description here

Я хотел бы призвать вас решительно принять Muenchian grouping, чтобы выбрать отдельные секции, вместо жесткого кодировкой повторного вызова именованного шаблона, показанного здесь.

+0

@ Daniel Haley Вы можете скопировать механизм усреднения отсюда. –

+0

Я ценю это, но я оставлю свой ответ удаленным. +1 для отличного ответа (как обычно). –

+0

Это сработало. Я определенно изменил бы hardcoded значение для секции и поместил бы в цикл for для чтения из xml. Благодаря! – user4925190

Смежные вопросы