2013-07-02 3 views
1

У меня проблема с полем solr. когда несколько узлов не подходят, и оно показывает пустое поле.Матч в XSLT от solr

<field name="specs"/> 

XML-оригинал:

<?xml version="1.0" encoding="UTF-8"?> 
<tire xmlns="http://schema.grabber" xmlns:x="http://www.w3.org/1999/xhtml" 
    tire-type="2" product-type="tire" id="102694" trademark="dunlop" 
    season="3" width="130" height="70" wheels="12" load="62" speed="l" 
    host="norauto" model="d207" hostDetailId="102694" hostDbID="6"> 
    <url>product/_102694.html</url> 
    <price>49.95</price> 
    <ecorate>1.15</ecorate> 
    <currency>€</currency> 
    <vat>true</vat> 
    <img>images_produits/650x650/dunlop-d207-runscoot.jpg</img> 
    <content>DUNLOP D207 RUNSCOOT</content> 
    <specs> 
    <spec name="b_xl">0</spec> 
    </specs> 
</tire> 

Преобразование XSLT в XML Solr, это XSLT из Solr:

 <xsl:template match="/"> 
     <docs> 
      <xsl:apply-templates select="cb:tire|cb:products" /> 
     </docs> 
     </xsl:template> 
     <xsl:template match="cb:tire"> 
     <doc> 
      <xsl:apply-templates select="@*|*" /> 
     </doc> 
     </xsl:template> 
     <xsl:template match="cb:products"> 
     <xsl:apply-templates select="@*|*" /> 
     </xsl:template> 
     <xsl:template match="*/*[@name and not(parent::cb:products)]"> 
     <xsl:call-template name="field"> 
      <xsl:with-param name="name" select="concat(name(),'_',@name)"/> 
     </xsl:call-template> 
     </xsl:template> 
     <xsl:template match="*/*[not(@name) and not(parent::cb:products)]"> 
     <xsl:call-template name="field"/> 
     </xsl:teplate> 
     <xsl:template match="*[parent::cb:products]"> 
     <xsl:choose> 
      <xsl:when test="not(text())"> 
      <doc> 
      <xsl:apply-templates select="*|@*"/> 
      </doc> 
      </xsl:when> 
      <xsl:otherwise> 
      <xsl:call-template name="field"/> 
      </xsl:otherwise> 
     </xsl:choose> 
     </xsl:template> 

    <xsl:template match="*|@*"> 
    <xsl:call-template name="field"> 
     <xsl:with-param name="value" select="."/> 
    </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="field"> 
    <xsl:param name="name" select="name()" /> 
    <xsl:param name="value" select="text()" /> 
     <field name="{translate(lower-case($name),' ','_')}"> 
     <xsl:value-of select="$value" /> 
     </field> 
    </xsl:template> 

     <xsl:template match="text()"/> 
    </xsl:stylesheet> 

Проблема является элементом <specs><spec name="b_xl">0</spec></specs>, поле пустым, результат не правильный.

Это результат XML:

<docs> 
    <doc> 
    <field name="tire-type">1</field> 
    <field name="product-type">tire</field> 
    <field name="season">1</field> 
    <field name="id">135-80-r13-70-t-kingstar-sk70</field> 
    <field name="trademark">kingstar</field> 
    <field name="model">sk70</field> 
    <field name="width">135</field> 
    <field name="height">80</field> 
    <field name="wheels">13</field> 
    <field name="load">70</field> 
    <field name="speed">t</field> 
    <field name="host">tires</field> 
    <field name="hostdetailid">135-80-r13-70-t-kingstar-sk70</field> 
    <field name="hostdbid">1000</field> 
    <field name="url">135-80-r13-70-t-kingstar-sk70.html</field> 
    <field name="price">29.73</field> 
    <field name="currency">€</field> 
    <field name="vat">true</field> 
    <field name="img">media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/0/1/0181050080001.png</field> 
    <field name="content">135/80 R13 70 T KINGSTAR SK70</field> 
    <field name="specs" /> 
    </doc> 
</docs> 

Мне нужно, чтобы отобразить содержимое элемента, если он содержит спецификации.

+0

Ваш XSLT не является полным. Поле имени шаблона отсутствует. –

+0

извините, я отредактировал. –

ответ

1

Для работы с детьми спецификации в поле вы можете добавить шаблон, как это:

<xsl:template match="cb:specs" priority="1"> 
    <xsl:apply-templates /> 
</xsl:template> 

, который будет генерировать следующее поле:

<field name="spec_b_xl">0</field> 

Я не знаю, если это, как и ожидалось, потому что вы не сказали нам, кто должен выглядеть так:

+0

Этот xslt является общим и сложным для меня. Благодарю. –

+0

Я не понимаю, что вы подразумеваете под этим «xslt является общим». Вы имеете в виду, что «cb: specs» id не единственный элемент с дочерними узлами, который следует учитывать? –

Смежные вопросы