2011-01-28 3 views
1

Приветствую вас, я немного новичок в XSL и задал вопрос о шаблонах звонков и параметрах.Параметр, передаваемый шаблону вызова в xsl

Предположим, у меня есть следующий XML:

<rec> 
    <a>1</a> 
    <b>2</b> 
    <c>3</c> 
(etc.) 
</rec> 
<rec> 
    <a>4</a> 
    <b>9</b> 
    <c>2</c> 
(etc.) 
</rec> 

и т.д ...

Я пишу колл-шаблон, который будет отображать строку() в HTML-таблицы множество строк. Каждая строка должна записывать имя, среднее значение, мин, макс и т. Д. Каждого поля всего набора записей.

, так что я хотел бы назвать <xsl:call-template name="DisplayRow"> <xsl:with-param name="fieldname" select="??"/>

шаблон вызова нужно будет перебирать все записи, чтобы найти AVG, мин, макс, и т.д., так что я не уверен, что передать в качестве параметра вызова. Я надеялся, что смогу передать имя поля (a, b, c и т. Д.) И заставить его работать таким образом, но я не могу получить свой код для компиляции, когда я это делаю.

Например, чтобы найти максимальное значение поля 'а' Я хотел бы сделать что-то вроде:

<xsl:for-each select="/Rec[a!='NaN']"> 
    <xsl:sort data-type="number" select="a" order="ascending"/> 
    <xsl:if test="position()=1"> 

и т.д.

Для Avg я бы (пропуск NaN):

<xsl:value-of select="sum(/rec/a[number(.)=number(.)]) 
       div count(/rec/a[number(.)=number(.)])"/> 

и т. Д.

Мне также нужно распечатать буквальное имя (например, «a») в строке.

ТИА

+1

@ user594433: Пожалуйста, обеспечить желаемый результат для входного образца, который вы опубликовали: много раз, что, по его мнению, он должен делать, это не правильный способ XSLT. –

ответ

4

Что вам нужно будет выбрать для значения filedName паров зависит от того, что вы хотите сделать внутри шаблона.

Вы можете передать имя элемента, который вы хотите сгенерировать сводную информацию о: например. <xsl:with-param name="fieldname" select="'a'"/>

Вы можете получить, что с помощью local-name(): т.е. <xsl:with-param name="fieldname" select="local-name(.)"/> (если контекст является одним из тех элементов)

Если вы хотите создать сводную информацию для каждого из детей <rec>, то вы могли бы сделать что-то вроде следующее:

Эта таблица стилей:

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

    <xsl:key name="names" match="/records/rec/*" use="local-name(.)"/> 

    <xsl:template match="/"> 
     <table> 
      <tr> 
       <td>Name</td> 
       <td>Count</td> 
       <td>Min</td> 
       <td>Max</td> 
       <td>Avg</td> 
      </tr> 
      <xsl:for-each select="/records/rec/*[generate-id(.) = generate-id(key('names', local-name(.)))]"> 
       <xsl:call-template name="displayRow"> 
        <xsl:with-param name="fieldName" select="local-name(.)"></xsl:with-param> 
       </xsl:call-template> 
      </xsl:for-each> 
     </table> 
    </xsl:template> 

    <xsl:template name="displayRow"> 
     <xsl:param name="fieldName"/> 
     <tr> 
      <td> 
       <xsl:value-of select="local-name(/records/rec/*[local-name()=$fieldName])"/> 
      </td> 
      <td> 
       <xsl:value-of select="count(/records/rec/*[local-name()=$fieldName])" /> 
      </td> 
      <td> 
       <xsl:for-each select="/records/rec/*[local-name()=$fieldName][number(.)!='NaN']"> 
        <xsl:sort data-type="number" select="." order="ascending"/> 
        <xsl:if test="position()=1"> 
         <xsl:value-of select="."/> 
        </xsl:if>  
       </xsl:for-each> 
      </td> 
      <td> 
       <xsl:for-each 
        select="/records/rec/*[local-name()=$fieldName][number(.)!='NaN']"> 
        <xsl:sort data-type="number" select="." order="descending"/> 
        <xsl:if test="position()=1"> 
         <xsl:value-of select="."/> 
        </xsl:if>  
       </xsl:for-each> 
      </td> 
      <td> 
       <xsl:value-of 
        select="sum(/records/rec/*[local-name()=$fieldName]  [number(.)=number(.)]) 
        div count(/records/rec/*[local-name()=$fieldName][number(.)=number(.)])"/> 
      </td> 
     </tr> 
    </xsl:template> 

</xsl:stylesheet> 

Run против этого XML (образец XML, завернутые в элементе документа, чтобы сделать его хорошо сформирован):

<records> 
    <rec> 
     <a>1</a> 
     <b>2</b> 
     <c>3</c> 
     (etc.) 
    </rec> 
    <rec> 
     <a>4</a> 
     <b>9</b> 
     <c>2</c> 
     (etc.) 
    </rec> 
</records> 

Производит следующий вывод:

<?xml version="1.0" encoding="UTF-8"?> 
<table> 
    <tr> 
     <td>Name</td> 
     <td>Count</td> 
     <td>Min</td> 
     <td>Max</td> 
     <td>Avg</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>2</td> 
     <td>1</td> 
     <td>4</td> 
     <td>2.5</td> 
    </tr> 
    <tr> 
     <td>b</td> 
     <td>2</td> 
     <td>2</td> 
     <td>9</td> 
     <td>5.5</td> 
    </tr> 
    <tr> 
     <td>c</td> 
     <td>2</td> 
     <td>2</td> 
     <td>3</td> 
     <td>2.5</td> 
    </tr> 
</table> 
+0

+1 за хороший ответ. –

+0

Самые превосходные. Спасибо вам! – Matt

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