Я создаю приложение 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>
Согласно спецификации W3C в http://www.w3.org/TR/xslt#conflict в этой ситуации XSLT может на самом деле сигнализировать об ошибке, а не выбирать последний шаблон, поэтому, вероятно, следует избегать наличия шаблонов с равным приоритетом. –
@TimC - очень верно, и я должен был упомянуть об этом. – bjimba
@bjimba спасибо. удаление матчей, похоже, сработало. другой вопрос, я пытаюсь передать параметр в, но он продолжает ошибочно, я включил код в мое обновление, я запутываю использование параметров и шаблона вызова? Может передать его в переменную? –
Onlytito