【问题标题】:Error when using the tcmse:PublishBinary in XSLT TBB with the XSLT Mediator将 XSLT TBB 中的 tcmse:PublishBinary 与 XSLT 中介器一起使用时出错
【发布时间】:2012-06-11 10:12:25
【问题描述】:

我正在开发 SDL Tridion 2011 SP1 中的 XSLT TBB。我正在使用从 Tridion 网站下载的 XSLT 中介器。

我创建了一个 TBB 来检索图像,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:simple="uuid:c5e80ef4-9afd-421a-9205-d5af4c9f2c5c" 
    xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:tcm="http://www.tridion.com/ContentManager/5.0"
    xmlns:tcmse=”http://www.tridion.com/ContentManager/5.1/TcmScriptAssistant”
    exclude-result-prefixes="msxsl simple">

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

    <xsl:template match="/">
        <xsl:element name="p">
            <xsl:apply-templates select="tcm:Component/tcm:Data/tcm:Content/simple:Content"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="simple:Content">
        <xsl:element name="img">
            <xsl:attribute name="src">
                <xsl:value-of select="tcmse:PublishBinary(string(simple:photo/@xlink:href)))"/>
            </xsl:attribute>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

我收到错误

  [CDATA[Unable to retrieve rendered data from Component Presentation.]]>
</tcm:Line>
<tcm:Line ErrorCode="80040000" Cause="true">
    <![CDATA[
     Cannot find a script or an extension object associated with namespace
     'http://www.tridion.com/ContentManager/5.1/TcmScriptAssistant'.]]

我知道问题是由于 'http://www.tridion.com/ContentManager/5.1/TcmScriptAssistant'。

任何人都可以提出克服它所需的修改吗?

我是否需要更改 TBB 或组件模板中的任何内容。

谢谢。

【问题讨论】:

    标签: tridion tridion-2011 tridion2009


    【解决方案1】:

    tcmse:PublishBinary 不是由 XSLT 中介实现的。这是默认 XSLT 模板引擎的功能,而不是中介引擎的功能。

    要使用 XSLT Mediator 发布二进制文件,您可以执行以下操作:

    <xsl:element name="img">
      <xsl:attribute name="src">
        <xsl:value-of select="simple:image/@xlink:href"/>
      </xsl:attribute>
    </xsl:element>
    

    然后确保使用默认完成操作,或者至少使用“从 HTML 中提取二进制文件”和“在包中发布二进制文件”TBB

    (取自http://yoavniran.wordpress.com/2009/07/11/implementing-the-xslt-mediator-part-1/

    【讨论】:

      【解决方案2】:

      XSLT Mediator 允许您向 XSLT Extension 对象添加新方法,您可以在 XSLT Mediator 包中的“XSLT Template Helper”类中找到它。

      为了使用它,您需要在 XSLT 模板中添加“http://www.sdltridion.com/ps/XSLTHelper”命名空间,例如 xmlns:ext="http://www.sdltridion.com/ ps/XSLTHelper”。

      PublishBinary 方法的示例如下所示。

      public string PublishBinary(string tcmUri)
      {
        Component mComponent = new Component(new TcmUri(tcmUri), session);
        Binary binary = engine.PublishingContext.RenderedItem.AddBinary(mComponent);
        return binary.Url;
      }
      
      public string PublishBinary(string tcmUri, string sgTcmUri)
      {
        Component mComponent = new Component(new TcmUri(tcmUri), session);
        StructureGroup sg = new StructureGroup(new TcmUri(sgTcmUri), session);
        Binary binary = engine.PublishingContext.RenderedItem.AddBinary(mComponent,sg);
        return binary.Url;
      }
      

      你可以像这样使用这些方法。

      <xsl:element name="img">
          <xsl:attribute name="src">
              <xsl:value-of select="ext:PublishBinary(string(@xlink:href))" />
          </xsl:attribute>
      </xsl:element>
      

      【讨论】:

      • 感谢您的回答。如果可能的话,您能否也提供 RenderComponentPresentation 方法的代码。一个小小的疑问。我现在只需要在 XSLT TBB 中添加提到的命名空间。
      • 是的,您只需要添加提到的命名空间。请注意,在我的代码示例中,我使用的是引擎、包和会话对象,因为 XSLT 中介器是开源的,您可能需要稍微修改它以将这些属性添加到帮助程序中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多