在特定条件下调用模板XSLT和C#
我正在创建一个C#应用程序。应用程序将把参数传递到XSLT文件中。我想要的是根据组合框中选择的参数调用某个模板 我正在测试在特定条件下调用模板XSLT和C#,c#,xml,winforms,xslt,C#,Xml,Winforms,Xslt,我正在创建一个C#应用程序。应用程序将把参数传递到XSLT文件中。我想要的是根据组合框中选择的参数调用某个模板 我正在测试方法,它只显示我的上一个模板,而不是我正在调用的模板。我已经了解了调用模板的功能,但仍然不起作用。我用对了吗 <?xml version="1.0"?><!-- DWXMLSource="lab06.xml" --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1
方法,它只显示我的上一个模板,而不是我正在调用的模板。我已经了解了调用模板的功能,但仍然不起作用。我用对了吗
<?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>
JAVA
应用
埃克玛
预期用途
语言文字
标准
语言文字
程序设计
预期用途
标准
更新:
我试图将一个参数传递到调用模板中,但它不起作用。我是否混淆了参数和调用模板的使用?我能把它传给变量吗?我的计划是使用
将参数从我的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>
Java
应用
埃克玛
语言温度
您偶然发现了XSLT的一个奇怪的语义“特性”。通常,xsl:template
会有一个match
属性或一个name
属性来指示何时应用它。这很少见,但它可以同时具有这两个属性,但这意味着名称或匹配可以触发应用程序
在您的情况下,每个模板都有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>
根据W3C规范,在这种情况下,XSLT实际上可能会发出错误信号,而不是选择最后一个模板,因此避免使用同等优先级的模板可能是一种很好的做法。@TimC-非常正确,我应该提到这一点。@bjimba谢谢。移除火柴似乎有效。另一个问题,我试图将一个参数传递到,但它一直出错,我已经在更新中包含了代码,我是否混淆了参数和调用模板的使用?可以将其传递到变量中吗?