试图在Commerce Server 2009中找到XSLT的XML

时间:2013-05-24 13:59:00

标签: xml xslt

我正在尝试从XML获取XPath,以便我可以使用XSLT从XML检索数据。我的问题是我无法看到XML,我需要它在XSLT中提供XPath。我怎么知道哪个XSLT正在使用哪个XML。我正在使用Commerce Server 2009的Search Web部分。

2 个答案:

答案 0 :(得分:0)

Tsheten,

我感觉到你的痛苦。首先,让我帮助您更好地了解您正在使用的SharePoint扩展性工具包的体系结构。在可扩展性工具包中,您可能已经看到,有两个主要项目可以控制搜索的执行以及结果的转换和显示。

控制器层

如果您打开Microsoft.Commerce.sln解决方案,请导航至Portal>常见>控制器文件夹。在这里,您将看到所有控制器,其中包含用于针对Commerce Server Foundation创建和执行CRUD操作(CommerceQuery,CommerceUpdate,CommerceDelete和CommerceCreate)的代码。

在SearchController.cs中,您将看到一个名为DoProductQuerySearch的方法。此方法负责通过Commerce Foundation执行产品查询。请参阅下面的代码片段,了解我正在谈论的内容:

    /// <summary>
    /// Performs a product query search.
    /// </summary>
    /// <param name="catalogName">The catalogName</param>
    /// <param name="categoryName">The categoryName</param>
    /// <param name="requiredProperties">The required product properties</param>
    /// <param name="searchPhrase">The search phrase</param>
    /// <param name="whereClause">The where clause</param>
    /// <param name="orderKey">The property by which the search results should be sorted.</param>
    /// <param name="sortOrder">The direction by which the search results should be sorted.</param>
    /// <param name="recordIndex">The index of the first result to return</param>
    /// <param name="recordsPerPage">The number of records to return.</param>
    /// <param name="totalResultCount">An out parameter for the totalResultCount.  That is, the total number of hits for the search.</param>
    /// <returns>A list of Products.</returns>
    public static List<Product> DoProductQuerySearch(string catalogName, string categoryName, List<string> requiredProperties, string searchPhrase, string whereClause, string orderKey, Microsoft.Commerce.Contracts.Messages.SortDirection sortOrder, int recordIndex, int recordsPerPage, out int totalResultCount)
    {
        List<Product> products = new List<Product>();

        var query = new CommerceQuery<CatalogEntity, CommerceCatalogFullTextSearchBuilder>();
        query.SearchCriteria.Catalogs.Add(catalogName);
        query.SearchCriteria.FirstItemIndex = recordIndex;
        query.SearchCriteria.FullTextSearchType = CommerceFullTextSearchType.FreeText;
        query.SearchCriteria.NumberOfItemsToReturn = recordsPerPage;
        query.SearchCriteria.ReturnTotalItemCount = true;

PRESENTER LAYER

SearchController.DoProductQuerySearch由Search Results Presenter类调用。要查找此课程,请导航至Portal&gt; UI&gt;搜索文件夹并打开SearchResultsPresenter类。在SearchResultsPresenter.cs类中,有一个GetProductQuerySearchResults方法,该方法调用以返回商业实体列表。在这种方法中,您将看到接近以下代码的内容:

       Collection<Product> products = new Collection<Product>(productResults);

            // Set the products in the View
            this.View.Products = products;

            **ProductXml productXml = new ProductXml(this.GetPropertyCollection(this.View.SearchRequiredProperties), products);**

            XsltArgumentList xsltArgList = new XsltArgumentList();
            xsltArgList.AddParam("DefaultImagesRepository", string.Empty, SiteContext.Current.DefaultImagesRepository);
            xsltArgList.AddParam("_catalog", string.Empty, SiteContext.Current.DefaultCatalogName);
            xsltArgList.AddParam("secondSearch", string.Empty, secondSearch);
            xsltArgList.AddParam("_currentDate", string.Empty, DateTime.Now.ToString("M/d/yyyy h:mm:ss tt", CultureInfo.CurrentCulture));
            xsltArgList.AddParam("_OnlineSearch", string.Empty, this.onlineSearch);

            this.RenderResults(xsltArgList, productXml.ToString());

ProductXml类包含您要查找的内容。导航到Portal&gt; UI&gt;目录&gt; Business文件夹,然后双击ProductXml.cs。在这里,您将看到此类是产品对象的XML表示形式。它包含一堆帮助方法,可以呈现XML的各个部分。它使用StringBuilder.Append手动构建XML文档并将其返回到SearchResultsPresenter进行显示。在下面的示例中,您可以看到对于搜索结果中的每个产品,OutputProducts辅助方法调用另一个辅助方法来手动构建构成XML文档的XML元素。

   private string OutputProducts()
    {
        StringBuilder xmlSb = new StringBuilder(this._products.Count * 512);

        xmlSb.Append(XmlElementStartOpen); // <
        xmlSb.Append(XmlRootNodeName);
        xmlSb.Append(XmlElementStartClose); // >

        foreach (Product item in this._products)
        {
            this.OutputCatalogItem(xmlSb, item);
        }

        xmlSb.Append(XmlElementEndOpen); // </
        xmlSb.Append(XmlRootNodeName);
        xmlSb.Append(XmlElementEndClose); // >

        return xmlSb.ToString();
    } 
 private void OutputCatalogItem(StringBuilder xmlSb, ICommerceEntity catalogItem, string xmlNodeName)
    {
        System.Diagnostics.Debug.Assert(xmlSb != null, "The value of xmlSb should never be null.");

        xmlSb.Append(XmlElementStartOpen); // <
        xmlSb.Append(xmlNodeName);
        xmlSb.Append(" ");
        xmlSb.Append(Product.PropertyName.Id);
        xmlSb.Append(XmlAttributeEqualAndQuote); // ='
        xmlSb.Append(catalogItem.Properties[Product.PropertyName.Id]);
        xmlSb.Append(XmlAttributeQuote); // '
        xmlSb.Append(XmlElementEndClose); // >

        this.OutputProperties(xmlSb, catalogItem, this._productProperties);

        this.OutputRelatedCatalogItems(xmlSb, catalogItem, HierarchicalCatalogEntity.RelationshipName.CrossSells, XmlCrossSellsNodeName);
        this.OutputRelatedCatalogItems(xmlSb, catalogItem, HierarchicalCatalogEntity.RelationshipName.UpSells, XmlUpSellsNodeName);
        this.OutputRelatedCatalogItems(xmlSb, catalogItem, HierarchicalCatalogEntity.RelationshipName.KitContents, XmlKitContentsNodeName);

        this.OutputCategoryProducts(xmlSb, XmlCategoryProductsNodeName);
        this.OutputRelatedCatalogItems(xmlSb, catalogItem, Product.RelationshipName.Variants, XmlVariantsNodeName);
        this.OutputPersonalNotes(xmlSb);

        xmlSb.Append(XmlElementEndOpen); // </
        xmlSb.Append(xmlNodeName);
        xmlSb.Append(XmlElementEndClose); // >

        xmlSb.ToString();
    }

因此,正如您所看到的,没有一个简单的模式可以帮助您编写xpath查询,因为XML是由ProductXml类手动构建的。您有两种选择可以让您的生活更轻松,在您的webpart关联的XSLT模板中编写xpath。

选项1 :(错误选项)手动解析ProductXML文件

此选项要求您阅读整个ProductXML文件,以了解它为给定的一组搜索结果发出的元素和属性结构。

选项2 :(更好的选项)使用Visual Studio调试器制作示例XML文件

如果要创建XML的示例文件以帮助您编写XPATH,则需要在以下代码段的SearchResultsPresenter.GetProductQuerySearchResults方法的以下行中放置一个断点:

    **this.RenderResults(xsltArgList, productXml.ToString());**

调试w3wp.exe工作进程,当您点击此断点时,将productXml.ToString()添加到监视窗口并更改Visual Studio中的查看器,以允许您在监视窗口中以XML格式查看输出。然后将xml复制到记事本。这将允许您在XSLT模板中编写更改时使用示例XML输出,以便XPath正确遍历DOM。

对“已下载的物业未归还”的更新回复

搜索Web部件检索的搜索属性由导航到SharePoint站点的专用站点Intranet版本找到的产品属性选取器控制,并从Web部件属性菜单中选择“修改共享Web部件”。在那里,您将找到一个区域,用于指定应在产品查询中返回哪些属性。 当SearchController执行DoProductQuerySearch时,更改要返回的活动属性会有效地更改Commerce Foundation为Product Commece Entity请求的属性。您的XSLT很可能失败,因为返回集合的属性不包含CanBeDowloaded属性,因为Web部件未将其传递回控制器。我会在SearchController.DoProductQuerySearch中放置一个断点,并查看传入的属性。在紧跟下面的行之后的行上放置一个断点:

 var query = new CommerceQuery<CatalogEntity, CommerceCatalogFullTextSearchBuilder>();

然后,将query.Model.Properties添加到调试器中的监视窗口,并查看您在XPATH语句中查找的属性是否实际设置为返回。如果您要将该属性返回到另一个webpart,那么这意味着您在MetaDataDefinitions.xml文件中对该属性的配置是正确的,因此这不是罪魁祸首。您的webpart未正确配置为在产品查询中请求CanBeDownloaded属性可能很简单。

答案 1 :(得分:0)

您可以在Web部件属性中更改它。上面的帖子有它。如果您使用的是默认的可扩展性工具包,则应该可以使用产品选择器简单地添加它。