更新XSLT以合并模板调用

时间:2014-03-13 07:39:04

标签: c# xml xslt

我在C#中编辑xslt。 它中定义了一个模板“Get”。 我想调用此模板并将其传递给变量。

模板:

<xsl:template name="Get">

 <xsl:param name="varMonth" />
  <xsl:choose>
      <xsl:when test="$varMonth='JAN'">
        <xsl:value-of select="'A'" />
      </xsl:when>
 </xsl:choose>
</xsl:template>

XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<DocumentElement>
  <PositionMaster>
        <xsl:variable name="varName">
          <xsl:value-of select="''" />
        </xsl:variable>
  </PositionMaster>    
</DocumentElement>
</xsl:template>

</xsl:stylesheet>

代码: 我得到一个字符串作为模板的参数的输入

string input = "A";
XmlDocument xslDoc = new XmlDocument();
xslDoc.Load("a.xslt");
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xslDoc.NameTable);
nsMgr.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");
XmlElement valueOf = (XmlElement)xslDoc.SelectSingleNode("/xsl:stylesheet/xsl:template[@match = '/']/DocumentElement/PositionMaster/xsl:variable[@name = "varName"]/xsl:value-of", nsMgr);

if (valueOf != null)
{
// What should i write here to get the below modified XSLT
}

必需的XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <DocumentElement>
   <PositionMaster>
        <xsl:variable name="varName">
           <xsl:call-template name="Get">
             <xsl:with-param name="Month" select="input"/>
           </xsl:call-template>
        </xsl:variable>
   </PositionMaster>    
  </DocumentElement>
 </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

我是否理解你想要使用C#代码转换样式表?这看起来很疯狂;您正在使用XSLT,因此您可以使用XML转换语言:使用它!

但是,我很困惑,因为您的原始样式表和修改后的样式表都不是有效的XSLT。作为<DocumentElement>的孩子,您不能拥有xsl:stylesheet元素;它肯定需要在模板中。

使用XSLT转换XSLT样式表是常见的做法,它可以解决某些问题。但是,通常在有更好的技术可用时完成,例如添加样式表参数(全局xsl:param元素)。