2015-03-23 2 views
1

Я создаю приложение C#. Приложение передаст параметры в файл XSLT. Я хочу вызвать определенный шаблон на основе параметра, выбранного в поле со списком.Вызов шаблона при определенных условиях XSLT и C#

Я тестирую метод <xsl:call-template />, и он отображает только мой последний шаблон, а не тот, который я звоню. Я прочитал, что делает шаблон вызова, и все еще не работает. Правильно ли я использую его?

<?xml version="1.0"?><!-- DWXMLSource="lab06.xml" --> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >  

    <xsl:param name="selectedLanguage">Java</xsl:param> 
    <xsl:param name="selectedUse">Application</xsl:param> 
    <xsl:key name="language-by-use" match="language" use="purpose/intendedUse/@id" /> 
    <xsl:param name="selectedStandard">ECMA</xsl:param> 
    <xsl:key name="language-by-standard" match="language" use="standards/standard/@id" /> 

    <xsl:template match="/"> 
    <xsl:call-template name="intendedUseTemp"/> 
    </xsl:template> 


<xsl:template match="/" name="intendedUseTemp" > 
    <html> 
     <body> 
      <table border="1"> 
       <tr> 
        <th>Intended Use</th> 
        <th>Languages</th> 
       </tr> 
       <tr> 
        <td> 
         <xsl:value-of select="$selectedUse"/> 
        </td> 
        <td> 
         <xsl:for-each select="key('language-by-use', programming/purpose/intendedUse[. =$selectedUse]/@id)" > 
          <xsl:value-of select="name" /> 
          <br /> 
         </xsl:for-each> 
        </td> 

       </tr> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="/" name="standardTemp" > 
    <html> 
     <body> 
      <table border="1"> 
       <tr> 
        <th>Standard</th> 
        <th>Languages</th> 
       </tr> 
       <tr> 
        <td> 
         <xsl:value-of select="$selectedStandard"/> 
        </td> 
        <td> 
         <xsl:for-each select="key('language-by-standard', programming/standards/standard[.=$selectedStandard]/@id)" > 
          <xsl:value-of select="name" /> 
          <br /> 
         </xsl:for-each> 
        </td> 
       </tr> 
      </table> 
     </body> 
    </html> 
</xsl:template> 



    <xsl:template match="/" name="languageTemp"> 
     <html> 

      <body> 
       <table border="1"> 
        <tr> 
         <th >Programming</th> 
         <th >Intended Use</th> 
         <th style="text-align:left">Standards</th> 
        </tr> 


        <xsl:for-each select="programming/languages/language[name=$selectedLanguage]"> 
         <tr> 
          <td><xsl:value-of select="name"/></td> 
          <td><xsl:variable name="intendedUseID" select="purpose/intendedUse/@id" /> 
           <xsl:for-each select="/programming/purpose/intendedUse[@id=$intendedUseID]" > 
            <xsl:value-of select="." /> <br /> 
           </xsl:for-each></td> 
          <td> <xsl:variable name="standardID" select="standards/standard/@id" /> 
           <xsl:for-each select="/programming/standards/standard[@id=$standardID]" > 
            <xsl:value-of select="." /> <br /> 
           </xsl:for-each></td> 
         </tr> 
        </xsl:for-each> 
       </table> 

      </body> 
     </html> 
    </xsl:template> 


</xsl:stylesheet> 

UPDATE:

Я пытаюсь передать параметр в Call-шаблон, но он не работает. Я запутываю использование параметров и шаблона вызова? Могу ли я передать его в переменную? Мой план заключается в использовании <xsl:if> передать параметры из моего приложения C# в XSLT

<xsl:param name="selectedLanguage">Java</xsl:param> 
<xsl:param name="selectedUse">Application</xsl:param> 
<xsl:param name="selectedStandard">ECMA</xsl:param> 
<xsl:param name="selectedBox">languageTemp</xsl:param> 

<xsl:key name="language-by-use" match="language" use="purpose/intendedUse/@id" /> 
<xsl:key name="language-by-standard" match="language" use="standards/standard/@id" /> 



<xsl:template match="/"> 
    <xsl:call-template name="$selectedBox"/> 
</xsl:template> 

ответ

1

Вы попали на одну из нечетной семантической «особенности» XSLT. Обычно xsl:template будет либо иметь атрибут match, либо атрибут name, чтобы указать, когда он будет применяться. Это редко, но это может быть и то, и другое, но это означает, что либоname, либо match может запускать приложение.

В вашем случае каждый шаблон содержит match="/". Итак, на входе, как XSLT решает, какой из ваших шаблонов выбрать? Вы ожидаете, что он будет использовать первый, но все они имеют равный приоритет, поэтому правило тай-брейка в XSLT заключается в использовании последнего, с которым столкнулись.

ОБНОВЛЕНИЕ: Относительно вашего обновленного вопроса. Да, вы можете передать параметры в именованные шаблоны, и это выглядит следующим образом:

<!-- the named template --> 
<xsl:template name="xyzzy"> 
    <xsl:param name="plugh"/> 
    <!-- do something here with $plugh --> 
</xsl:template> 

<xsl:template match="some-node"> 
    <-- calling the template named xyzzy --> 
    <xsl:call-template name="xyzzy"> 
     <xsl:with-param name="plugh" select="child-node"/> 
    </xsl:call-template> 
</xsl:template> 
+1

Согласно спецификации W3C в http://www.w3.org/TR/xslt#conflict в этой ситуации XSLT может на самом деле сигнализировать об ошибке, а не выбирать последний шаблон, поэтому, вероятно, следует избегать наличия шаблонов с равным приоритетом. –

+0

@TimC - очень верно, и я должен был упомянуть об этом. – bjimba

+0

@bjimba спасибо. удаление матчей, похоже, сработало. другой вопрос, я пытаюсь передать параметр в , но он продолжает ошибочно, я включил код в мое обновление, я запутываю использование параметров и шаблона вызова? Может передать его в переменную? – Onlytito

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