Передача параметров в шаблон вызова в xsl - PullRequest
1 голос
/ 29 января 2011

Привет, я немного новичок в 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, min, max и т. д., поэтому я не уверен, что передать в качестве параметра вызова.Я надеялся, что смогу передать имя поля (a, b, c и т. Д.) И заставить его работать таким образом, но не могу заставить мой код компилироваться, когда я это делаю.

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

  <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') в строке.

TIA

1 Ответ

4 голосов
/ 29 января 2011

То, что вам нужно будет выбрать для значения параметра 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>

Запустите этот 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...