2012-06-11 8 views
0
<xsl:call-template name="myfield">    
        <xsl:with-param name=A/> 
        <xsl:with-param name=B/> 
        <xsl:with-param name=C/> 
        <xsl:if test="not(starts-with(specialTest))"> 
         <xsl:with-param name="TEST" select="'someFunction'"/> 
        </xsl:when>      
        <xsl:with-param name="D"/>    
        <xsl:with-param name="E"/>      
</xsl:call-template>  

Привет, ребята, я пытаюсь поставить XSL: когда условие, как, когда я генерировать эту таблицу стилей, я хочу, чтобы другие PARAMS ABCDE называться даже если тест условие не выполняется. Однако компилятор XSL жалуется, что xsl: если не может быть дочерним элементом xsl: call-template.Верстка XSL: когда в XSL: колл-шаблон

Любой совет или любая исчерпывающая таблица того, что может быть вложенным и что не может быть вложено для XSL? Мухос Грасиас!

+0

Я понимаю, что вы можете поставить условие теста вне шаблона вызова, но для моего случая мой шаблон вызова имеет около 50 + параметров, и поэтому я хотел бы сделать мой код кратким. вот почему я ищу положить условие xsl: if в шаблон вызова, вместо того, чтобы повторять огромные куски кода. – bouncingHippo

+0

У вас также есть другая проблема: нет функции XPath 'start-with()', которая принимает только один аргумент. Вы тоже должны это исправить. –

ответ

2

В W3C XSLT, для каждого элемента есть сводка синтаксиса, в которой говорится, какие другие элементы она может содержать. Например, xsl:choose может содержать только xsl:when и xsl:otherwise; xsl:call-template может содержать только xsl:with-param. Существует много элементов (например, xsl:element и xsl:attribute и xsl:if), которые содержат то, что XSLT 2.0 вызывает «конструктор последовательностей» (XSLT 1.0 официально называет его «шаблоном», но никто не использует этот термин с этим значением). Конструктор последовательность представляет собой последовательность команд, и есть список элементов XSLT, которые классифицируются как инструкции, например, xsl:ifxsl:element, xsl:value-of, xsl:comment и т.д.

Так гнездования правила существуют в спецификации.

1

<xsl:when> может использоваться только в пределах элемента <xsl:choose> - однако единственным элементом, доступным в пределах <xsl:call-template>, является <xsl:with-param>.

Попробуйте это (непроверенные) ...

<xsl:call-template name="myfield">    
    <xsl:with-param name=A/> 
    <xsl:with-param name=B/> 
    <xsl:with-param name=C/> 
    <xsl:with-param name="TEST"> 
    <xsl:if test="not(starts-with(specialTest))">your value</xsl:if> 
    </xsl:with-param> 
    <xsl:with-param name="D"/>    
    <xsl:with-param name="E"/>      
</xsl:call-template> 

(также вы ведущий <xsl:if> но завершающая <\xsl:when> в вашем примере ... это не поможет.)

+0

thx freefaller, trailing \ xsl: when typo ... я тестировал xsl: когда раньше. – bouncingHippo

+0

Фактически, мои параметры на самом деле похожи на: bouncingHippo

+0

@bouncingHippo - Я просто дал вам пример того, как возможно иметь условную логику для параметра (т. е. помещать его в параметр, а не за его пределы). Это вам нужно реализовать. Как говорит Майкл, [спецификация W3C XSLT] (http://www.w3.org/TR/xslt) предоставит вам все, что вам нужно, иначе, если у вас есть доступ к редактору, например Visual Studio, он предоставит помощникам intelisense – freefaller

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