Альтернативные способы установки значения переменной в XSLT? - PullRequest
3 голосов
/ 12 октября 2010

У меня есть базовый XSLT-фильтр в SharePoint 2007 DataFormWebPart:

<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[((ddwrt:FormatDateTime(string(@MyDate) ,1061 ,'MM'))=$MyParameter)]"/>

$ MyParameter происходит из элемента управления ASP.NET.Но попытка установить значение переменной любым другим способом приводит к ошибке:

<xsl:variable name="Rows">
<xsl:value-of select="/dsQueryResponse/Rows/Row[((ddwrt:FormatDateTime(string(@MyDate) ,1061 ,'MM'))=$MyParameter)]"/>
</xsl:variable>

или

<xsl:variable name="Rows">
/dsQueryResponse/Rows/Row[((ddwrt:FormatDateTime(string(@MyDate) ,1061 ,'MM'))=$MyParameter)]
</xsl:variable>

Я получаю следующую ошибку: Аргумент 1 должен вернуть узел-задавать.-> count ($ Rows) <- </strong>

В конечном итоге я пытаюсь добиться чего-то похожего:

<xsl:variable name="Rows">
<xsl:choose>
  <xsl:when test="($MyParameter2 = '1')">
    <xsl:value-of select="/dsQueryResponse/Rows/Row[((ddwrt:FormatDateTime(string(@MyDate) ,1061 ,'MM'))=$MyParameter)]"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="/dsQueryResponse/Rows/Row[((ddwrt:FormatDateTime(string(@MyDate) ,1061 ,'MM'))=$otherParameter)]"/>
  </xsl:otherwise>
</xsl:choose>
</xsl:variable>

Возможно ли что-нибудь подобное с XSLT или я должен выглядетьдля других возможностей в SharePoint Designer?

1 Ответ

5 голосов
/ 12 октября 2010

Когда вы используете функцию count(), она подсчитывает узлы в наборе узлов , указанном в параметре.

Два других способа создания переменной $Rows - это присвоение строк , а не наборов узлов .

  1. Когда вы устанавливаете переменную первым способом, ваш оператор select возвращает набор узлов из вычисленного выражения XPATH.

  2. xsl:value-of возвращает строку. Итак, когда вы создаете свою переменную вторым способом, вы присваиваете строковое значение выбранного набора узлов, который был выбран с вашим XPATH.

  3. Помещая строку в строку внутри xsl:variable, как вы сделали третий способ, присваиваете это строковое значение переменной $Rows. Хотя это значение оказывается выражением XPATH, оно не оценивается как таковое. Он просто назначает буквенную строку "/ dsQueryResponse / Rows / Row [((ddwrt: FormatDateTime (string (@MyDate), 1061, 'MM')) = $ MyParameter)]" переменной $Rows.

Решение: Попробуйте объединить критерии XPATH в один оператор select и включить логику для проверки значения $MyParameter2 в фильтре предикатов:

<xsl:variable name="Rows" 
    select="/dsQueryResponse/Rows/Row[
        ((ddwrt:FormatDateTime(string(@MyDate) ,1061 ,'MM'))=$MyParameter) 
        and $MyParameter2='1'
      ] 
  | 
    /dsQueryResponse/Rows/Row[
        ((ddwrt:FormatDateTime(string(@MyDate) ,1061 ,'MM'))=$otherParameter) 
        and $MyParameter2 !=1
       ]" 
 />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...