Вызов шаблона в определенных условиях XSLT и C #

1

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

Я тестирую метод <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>

ОБНОВИТЬ:

Я пытаюсь передать параметр в шаблон вызова, но он не работает. Я запутываю использование параметров и шаблона вызова? Могу ли я передать его в переменную? Мой план состоит в том, чтобы использовать <xsl:if> для передачи параметров из моего приложения С# в 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>
Теги:
winforms
xslt

1 ответ

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 по адресу w3.org/TR/xslt#conflict, в этой ситуации XSLT может фактически сигнализировать об ошибке, а не выбирать последний шаблон, поэтому, вероятно, рекомендуется избегать шаблонов с одинаковым приоритетом.
  • 0
    @TimC - очень верно, и я должен был упомянуть это.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню