Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Jeroen Breuer 4861 posts 12138 karma points MVP 3x admin c-trib
    Nov 28, 2012 @ 17:05
    Jeroen Breuer
    0

    XSLT extensions not working

    Hello,

    I've got an old Umbraco website running on 4.0.3 and I'm trying to extend the \umbraco\xslt\searchResult.xslt file to show more info in the backoffice search results. Because I don't want to change the source I'm trying to add my own XSLT extension which displays the template of the found node. When I try to add my own XSLT extension I'm getting this error:

    System.Xml.Xsl.XsltException: Cannot find the script or external object that implements prefix 'Project.Tools'. at System.Xml.Xsl.XsltOld.XsltCompileContext.ResolveFunction(String prefix, String name, XPathResultType[] argTypes) at MS.Internal.Xml.XPath.FunctionQuery.SetXsltContext(XsltContext context) at System.Xml.Xsl.XsltOld.Processor.GetValueQuery(Int32 key, XsltCompileContext context) at System.Xml.Xsl.XsltOld.Processor.ValueOf(ActionFrame context, Int32 key) at System.Xml.Xsl.XsltOld.ValueOfAction.Execute(Processor processor, ActionFrame frame) at System.Xml.Xsl.XsltOld.ActionFrame.Execute(Processor processor) at System.Xml.Xsl.XsltOld.Processor.Execute() at System.Xml.Xsl.XsltOld.Processor.Execute(TextWriter writer) at System.Xml.Xsl.XslTransform.Transform(XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver) at System.Xml.Xsl.XslTransform.Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver) at System.Web.UI.WebControls.Xml.Render(HtmlTextWriter output) at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) at umbraco.uicontrols.Pane.Render(HtmlTextWriter writer) in d:\TeamCity\buildAgent\work\7380c184e9fcd3ea\components\umbraco.controls\pane.cs:line 99

    This is how the XSLT file:

    <?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:Project.Tools="urn:Project.Tools" 
                    exclude-result-prefixes="msxsl Project.Tools">
      <xsl:output method="xml" indent="yes"/>
    
      <xsl:template match="/">
        <ol>
          <xsl:for-each select="/results/result">
            <li>
              <h4>
                <a href="#" onClick="openItem('editContent.aspx?id={@id}');">
                  <!-- add accesskey support for the first 9 results -->
                  <xsl:if test="position() &lt; 10">
                    <xsl:attribute name="accesskey">
                      <xsl:value-of select="position()"/>
                    </xsl:attribute>
                  </xsl:if>
                  <xsl:value-of select="@title"/>
                  <xsl:value-of select="Project.Tools:GetTemplate(@id)"/>
                </a>
              </h4>
              <p>
                <em>Created <xsl:value-of select="@author"/> on <xsl:value-of select="@createDate"/>
              </em>
              </p>
            </li>
    
          </xsl:for-each>
        </ol>
      </xsl:template>
    </xsl:stylesheet>
    
    I also tried some default Umbraco XSLT extensions like umbraco.library, but those aren't working either. Any idea what could be wrong?
    Jeroen
  • Douglas Robar 3570 posts 4671 karma points MVP ∞ admin c-trib
    Nov 28, 2012 @ 17:10
    Douglas Robar
    0

    In the 4.0 versions you need to manually add the extensions to the /config/xsltextensions.config file I believe.

    cheers,
    doug. 

  • Jeroen Breuer 4861 posts 12138 karma points MVP 3x admin c-trib
    Nov 28, 2012 @ 17:11
    Jeroen Breuer
    0

    I already added the extension there. It works in normal XSLT files, but not in this XSLT file which is in the Umbraco backoffice. Also tried Umbraco XSLT extensions and those also don't work.

    Jeroen

  • Douglas Robar 3570 posts 4671 karma points MVP ∞ admin c-trib
    Nov 28, 2012 @ 17:14
    Douglas Robar
    0

    Ahhh... sorry, missed that. Those are different and not handled the same way. You might need to put the code in your xslt file directly, but someone who is better with the source of the back office might know better.

    Here's how to do it: http://blog.percipientstudios.com/2009/9/21/advanced-xslt-with-net-namespaces.aspx. Read the comments too about debug mode.

    cheers,
    doug. 

     

  • Jeroen Breuer 4861 posts 12138 karma points MVP 3x admin c-trib
    Nov 28, 2012 @ 17:30
    Jeroen Breuer
    0

    I'm now trying in-line C# like you mentioned in your blog, but it gives me this error:

    Error creating control 
    System.Xml.Xsl.XsltCompileException: XSLT compile error at C:\SVN\PrismaIntranet\trunk\site\umbraco\xslt\searchResult.xslt(30,58). See InnerException for details. ---> System.Xml.Xsl.XsltException: The 'msxsl:script' element cannot be empty. at System.Xml.Xsl.XsltOld.ContainerAction.AddScript(Compiler compiler) at System.Xml.Xsl.XsltOld.ContainerAction.CompileTopLevelElements(Compiler compiler) at System.Xml.Xsl.XsltOld.ContainerAction.CompileDocument(Compiler compiler, Boolean inInclude) at System.Xml.Xsl.XsltOld.RootAction.Compile(Compiler compiler) at System.Xml.Xsl.XsltOld.Compiler.CreateRootAction() at System.Xml.Xsl.XsltOld.Compiler.Compile(NavigatorInput input, XmlResolver xmlResolver, Evidence evidence) --- End of inner exception stack trace --- at System.Xml.Xsl.XsltOld.Compiler.Compile(NavigatorInput input, XmlResolver xmlResolver, Evidence evidence) at System.Xml.Xsl.XslTransform.Compile(XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence) at System.Xml.Xsl.XslTransform.Load(XPathNavigator stylesheet, XmlResolver resolver) at System.Xml.Xsl.XslTransform.Load(IXPathNavigable stylesheet, XmlResolver resolver) at System.Xml.Xsl.XslTransform.Load(XmlReader stylesheet) at System.Web.UI.WebControls.Xml.LoadTransformFromSource() at System.Web.UI.WebControls.Xml.Render(HtmlTextWriter output) at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) at System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) at System.Web.UI.Control.RenderControl(HtmlTextWriter writer) at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) at System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) at umbraco.uicontrols.Pane.Render(HtmlTextWriter writer) in d:\TeamCity\buildAgent\work\7380c184e9fcd3ea\components\umbraco.controls\pane.cs:line 99

    The element is not empty. If I remove the complete msxsl:script part it doesn't give an error.

    Jeroen

  • Douglas Robar 3570 posts 4671 karma points MVP ∞ admin c-trib
    Nov 28, 2012 @ 17:32
    Douglas Robar
    0

    I wonder if it just isn't possible in the back office context? I've never tried it but it sure seems it ought to work.

    Can you post a trimmed down version of your searchResult.xslt file? Perhaps a second set of eyes might spot something.

    cheers,
    doug. 

  • Jeroen Breuer 4861 posts 12138 karma points MVP 3x admin c-trib
    Nov 28, 2012 @ 17:37
    Jeroen Breuer
    0

    The xslt in my first post is the complete search result file. Here is how the file is loaded in the Umbraco backoffice:

    search.aspx

    <%@ Page Language="C#" MasterPageFile="../masterpages/umbracoDialog.Master" AutoEventWireup="true"
        CodeBehind="search.aspx.cs" Inherits="umbraco.presentation.dialogs.search" %>
    
    <%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
    <asp:Content ID="header1" ContentPlaceHolderID="head" runat="server">
    <script type="text/javascript">
        function openItem(url) {
            parent.right.document.location.href = "../" + url;
            parent.closeModal();
        }
    </script>
    </asp:Content>
    <asp:Content ID="Content1" ContentPlaceHolderID="body" runat="server">
        <cc1:Pane ID="Wizard" runat="server">
            <h3>Search</h3>
            <p>
            <asp:TextBox ID="keyword" runat="server" Width="500" CssClass="bigInput"></asp:TextBox> 
                <asp:Button ID="searchButton" runat="server" Text="Search" onclick="search_Click" /><br />
            </p>
            <asp:Xml ID="searchResult" runat="server" TransformSource="../xslt/searchResult.xslt"></asp:Xml>
        </cc1:Pane>
    </asp:Content>
    <asp:Content ID="footer1" ContentPlaceHolderID="footer" runat="server">
    <script type="text/javascript">
        document.getElementById("ctl00_body_keyword").focus();
    </script>
    </asp:Content>
    
    search.aspx.cs

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    using umbraco.cms.businesslogic.index;
    
    namespace umbraco.presentation.dialogs
    {
        public partial class search : BasePages.UmbracoEnsuredPage
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                this.Page.Form.DefaultButton = this.searchButton.UniqueID;
    
                if (!IsPostBack && helper.Request("search") != "")
                {
                    keyword.Text = helper.Request("search");
                    doSearch();
    
                }
            }
    
            protected void search_Click(object sender, EventArgs e)
            {
                doSearch();
    
    
            }
    
            private void doSearch()
            {
                string query = keyword.Text;
                query = query.Trim();
    
                // Check for fulltext or title search
                string prefix = "";
                /*            if (query.Length > 0 && query.Substring(0, 1) != "*")
                                prefix = "Text:";
                            else
                                query = query.Substring(1, query.Length - 1);
                            */
    
                // Check for spaces
                if (query.IndexOf("\"") == -1 && query.Trim().IndexOf(" ") > 0)
                {
                    string[] queries = query.Split(" ".ToCharArray());
                    query = "";
                    for (int i = 0; i < queries.Length; i++)
                        query += prefix + queries[i] + "* AND ";
                    query = query.Substring(0, query.Length - 5);
                }
                else
                    query = prefix + query + "*";
    
                searchResult.XPathNavigator = cms.businesslogic.index.searcher.SearchAsXml(
    cms.businesslogic.web.Document._objectType, query, 100).CreateNavigator();
    
            }
        }
    }
    
    So perhaps the asp:Xml works different.
    Jeroen
  • Stephen 767 posts 2268 karma points c-trib
    Nov 28, 2012 @ 17:50
    Stephen
    2

    Correct me if I'm wrong, but asp:xml knows nothing about Umbraco's extensions. When we run an XML script on the front-end we add extensions, etc. to the XSLT engine before running it. I'm afraid the asp:xml control does nothing of that. So you try to use an extension that it's not aware of.

    Look at System.Web.UI.WebControls.Xml documentation, there might be a way to register extensions...

  • Jeroen Breuer 4861 posts 12138 karma points MVP 3x admin c-trib
    Nov 28, 2012 @ 17:55
    Jeroen Breuer
    0

    Hmm that would cause all these issues :p. Haven't looked at a way to register extensions yet, but if it's possible I'm afraid that I'll need to change something in the Umbraco source and that's what I've been trying to avoid here. If I need to change the Umbraco source anyways there are easier ways to extend the search results page.

    Jeroen

  • Douglas Robar 3570 posts 4671 karma points MVP ∞ admin c-trib
    Nov 28, 2012 @ 18:09
    Douglas Robar
    0

    *cough* You could use XSLTsearch *cough*

     

  • Jeroen Breuer 4861 posts 12138 karma points MVP 3x admin c-trib
    Nov 29, 2012 @ 10:00
    Jeroen Breuer
    0

    Now I'm using Simple Search for Umbraco. It replaces searching in the Umbraco backoffice and I modified it to show the extra info I needed. This way I still didn't need to modify the Umbraco source.

    Jeroen

  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies