检查是否在xslt模板中定义了扩展对象

时间:2012-12-11 15:36:41

标签: c# .net xslt

我在.NET(C#)项目中使用XSLT。 我想知道是否可以在XSLT模板内部检查是否在({添加到] XsltArgumentList中定义了扩展对象。

XSLT名称空间声明

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:info="urn:info">

C#代码

public string Render(XElement xml, IInfo info) {    
    XsltArgumentList arguments = new XsltArgumentList();   
    if(info != null)
        arguments.AddExtensionObject("urn:info", info);

    var writterSettings = GetWritterSettings();  //omitted details just for simplicity
    var xslt = CreateXslCompiledTransform(); //omitted details just for simplicity            

    StringBuilder sb = new StringBuilder();
    using (XmlWriter writer = XmlWriter.Create(sb, writerSettings))
    {
        using (var itemReader = xml.CreateReader())
        {
            xslt.Transform(itemReader, xsltArguments, writer);
        }
    }
    return sb.ToString();  
}

在XSLT模板中,我希望在它不为null时使用扩展对象,而在为null时使用其他内容。 XSLT是否有一些特殊的标记或语法来实现这一点,或者根本不可能?

2 个答案:

答案 0 :(得分:3)

XSLT提供函数element-available()function-available()来检查特定扩展元素/函数是否可用,所以尝试类似

<xsl:choose>
  <xsl:when test="function-available('info:myFunction')">
    myFunction is available
  </xsl:when>
  <xsl:otherwise>
    myFunction is not available
  </xsl:otherwise>
</xsl:choose>

答案 1 :(得分:1)

我建议在ArgumentList中添加一个额外的参数来表示它是否为null。

您可以尝试使用not()运算符