2009-07-15 2 views
1

Я хотел бы обработать элемент в моем исходном XML-файле с использованием XSLT 2.0 (Saxon 9.1.0.7). Если кадр элемент содержит визуализатор атрибут Мне нужно отправить это из кадра шаблона в другой именованный шаблон, в противном случае я хотел бы послать рендерер значение по умолчанию для имени шаблона.Вызов именованного шаблона

Таким образом, в исходном файле XML я мог бы иметь следующее, в этом случае я хотел бы отправить значение по умолчанию для имени шаблона в качестве параметра:

<frame id="menu_frame_1"> 

Или, если визуализатора атрибута определяется в исходном XML-документ, то я хотел бы передать, что вместо значения по умолчанию:

<frame id="menu_frame_1" renderer="KONtx.element.Container"> 

проблема, которую я имею, я не знаю, как условно выбрать либо по умолчанию, или определенный атрибут если он существует и передать его в названный шаблон. Я попытался использовать xsl: выберите в шаблоне , но это запрещено. Кроме того, я бы переместил выбор за пределами шаблона и установил переменную с значением по умолчанию или атрибутом, но переменные неизменяемы, поэтому я не уверен, как обращаться с этим делом. Ниже приведен шаблон шаблона , и именованный шаблон, который я пытаюсь вызвать. Любая помощь приветствуется. Благодарю.

<xsl:template match="frame">  
    <!-- Call new object start named template below --> 
    <xsl:call-template name="newObjectStart"> 
     <xsl:with-param name="id"><xsl:value-of select="@id" /></xsl:with-param> 

     <xsl:choose> 
      <xsl:when test="@renderer"> 
       <xsl:with-param name="renderer"> 
        <xsl:value-of select="@renderer" /> 
       </xsl:with-param> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:with-param name="renderer">KONtx.element.Container</xsl:with-param> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:call-template> 

    ... 
</xsl:template> 

<!-- New Object Start Named Template --> 
<xsl:template name="newObjectStart"> 
    <xsl:param name="id" /> 
    <xsl:param name="renderer" /> 

    <xsl:text>var </xsl:text> 
    <xsl:value-of select="$id" /> 
    <xsl:text> = </xsl:text>  
    <xsl:text>new </xsl:text> 
    <xsl:value-of select="$renderer" /> 
    <xsl:text>({</xsl:text> 
</xsl:template> 

ответ

1

Вы должны поставить <xsl:choose> внутри <xsl:with-param> вместо снаружи.

<xsl:template match="frame"> 
    <!-- Call new object start named template below --> 
    <xsl:call-template name="newObjectStart"> 
    <xsl:with-param name="id"> 
     <xsl:value-of select="@id" /> 
    </xsl:with-param> 
    <xsl:with-param name="renderer"> 
     <xsl:choose> 
     <xsl:when test="@renderer"> 
      <xsl:value-of select="@renderer" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="'KONtx.element.Container'" /> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:with-param> 
    </xsl:call-template> 

    ... 
</xsl:template> 
+0

Спасибо, это работает и имеет смысл. Я пытаюсь заставить свою голову обернуться, как использовать xslt. – Steve

0

Попробуйте это


<xsl:choose> 
     <xsl:when test="@renderer"> 
      <xsl:call-template name="newObjectStart"> 
       <xsl:with-param name="id"><xsl:value-of select="@id" /></xsl:with-param> 
       <xsl:with-param name="renderer"><xsl:value-of select="@renderer" /></xsl:with-param> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:call-template name="newObjectStart"> 
       <xsl:with-param name="id"><xsl:value-of select="@id" /></xsl:with-param> 
       <xsl:with-param name="renderer">KONtx.element.Container</xsl:with-param> 
      </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:call-template> 

...