2010-10-12 2 views
3

У меня есть основной XSLT-фильтр для SharePoint 2007 DataFormWebPart:Альтернативные способы установки значения переменной в XSLT?

<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 ($ Ряды) < -

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

<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, ?

+0

Дубликат http://stackoverflow.com/questions/3834812/copy-an-xslt-variable – Marko

+0

Спасибо, я загляну в него и посмотрю, ответил ли уже на мой вопрос. – Indrek

+0

Попробуйте обернуть значение 'select' с помощью node-set(), если не использовать ответ по моему вопросу выше. – Marko

ответ

5

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

Остальные два способа, которыми вы пытаетесь построить переменную $Rows присваиваем Строки, а не множества узлов.

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

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

  3. Помещение строки внутри xsl:variable, как вы сделали третий путь, присваивает это строковое значение переменной $Rows. Хотя это значение бывает выражение XPATH, оно не оценивается как таковое. Он просто назначает литеральную строку «/ dsQueryResponse/Rows/Row [((ddwrt: FormatDateTime (строка (@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 
     ]" 
/> 
+0

+1 Хороший ответ.Я думаю, что на этот раз вы могли бы использовать оператор 'или' для уменьшения выражения. – 2010-10-12 13:35:43

+0

Хороший ответ, +1. –

+1

@Indrek, возможно, вы могли бы улучшить производительность этого, создав ключ, '; а затем с помощью этого ключа: 'select =" key ('rowsByDateTime', $ MyParameter) [$ MyParameter2 = '1'] | key ('rowsByDateTime', $ otherParameter) [$ MyParameter2! = 1] ' – LarsH

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