1

私は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>€&lt;/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>

XML solr での変換 XSLT。これは solr の xslt です。

      <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">€&lt;/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>

要素にspecsが含まれている場合は、要素の内容を表示する必要があります。

4

1 に答える 1

1

spec の子をフィールドとして処理するには、次のようなテンプレートを追加します。

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

次のフィールドが生成されます。

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

仕様の出力がどのように見えるべきかを教えてくれなかったため、これが期待どおりかどうかはわかりません。

于 2013-07-02T13:13:02.713 に答える