Based on content needs, I used different strategies to produce SOLR input documents.
One of old post, contains Excel input to SOLR input documents.
In this particular use-case, a simple XSL aka XSLT, style-sheet converts an incoming eCommerce XML content feed in to SOLR documents & pushes these documents to SOLR staging folder.
From there, our custom SOLR component consumes these xml to add or update new content at regular intervals. I will post that custom SOLR component logic later in this blog. For now, I am including sample stylesheet which produces solr input XML document based another XML input feed
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" />
<xsl:template match="/products">
<add>
<xsl:apply-templates />
</add>
</xsl:template>
<xsl:template match="product">
<doc>
<xsl:element name="field">
<xsl:attribute name="name">id</xsl:attribute>
<xsl:value-of select="./@skuNo"/>
</xsl:element>
<xsl:element name="field">
<xsl:attribute name="name">status</xsl:attribute>
<xsl:value-of select="./@status"/>
</xsl:element>
<xsl:element name="field">
<xsl:attribute name="name">brand</xsl:attribute>
<xsl:value-of select="./brand"/>
</xsl:element>
<xsl:element name="field">
<xsl:attribute name="name">description</xsl:attribute>
<xsl:value-of select="./descriptions/description"/>
</xsl:element>
<xsl:element name="field">
<xsl:attribute name="name">department</xsl:attribute>
<xsl:value-of select="./department/@name"/>
</xsl:element>
<!-- one can debate laterĂ¢€¦ this is for now -->:q!
<xsl:element name="field">
<xsl:attribute name="name">categoryname</xsl:attribute>
<xsl:value-of select="./class/@name"/>
</xsl:element>
<xsl:call-template name="addCurrentPrice">
<xsl:with-param name="price" select="."/>
</xsl:call-template>
<xsl:call-template name="addTaxonomyContent">
<xsl:with-param name="skid" select="."/>
</xsl:call-template>
</doc>
</xsl:template>
<xsl:template name="addCurrentPrice">
<xsl:param name="product"/>
<xsl:for-each select="./offers/offer/prices/*">
<xsl:element name="field">
<xsl:attribute name="name"><xsl:value-of select="@type"/></xsl:attribute>
<xsl:value-of select="@amount"/>
</xsl:element>
</xsl:for-each>
</xsl:template>
<xsl:template name="addTaxonomyContent">
<xsl:param name="product"/>
<xsl:for-each select="./hierarchy/*">
<xsl:variable name="ctr" select="position()"/>
<xsl:variable name="variable" select="concat('tname_',$ctr)"/>
<xsl:element name="field">
<xsl:attribute name="name"><xsl:value-of select="$variable"/></xsl:attribute>
<xsl:value-of select="@name"/>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
No comments:
Post a Comment