2013-04-09 7 views
0

У меня есть XSL, который должен быть сформирован для solr. xslt должен быть действителен для другого xml, который я создал.соответствует XSLT by solr

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:cb="http://schema.xslt.com/schema" 
    version="1.0"> 
    <xsl:template match="/"> 
    <docs> 
    <xsl:choose> 
    <xsl:when test="cb:products"> 
     <xsl:apply-templates select="@*|*" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:apply-templates select="cb:tire" /> 
    </xsl:otherwise> 
    </xsl:choose> 
    </docs> 
    </xsl:template> 
    <xsl:template match="cb:tire"> 
     <doc> 
     <xsl:apply-templates select="@*|*"/> 
     </doc> 
    </xsl:template> 
    <xsl:template match="*/*[@name]"> 
    <xsl:call-template name="field"> 
     <xsl:with-param name="name" select="concat(name(),'_',@name)"/> 
    </xsl:call-template> 
    </xsl:template> 
    <xsl:template match="*/*[not(@name)]"> 
    <xsl:call-template name="field"/> 
    </xsl:template> 
    <xsl:template match="@*"> 
    <xsl:call-template name="field"> 
     <xsl:with-param name="value" select="."/> 
    </xsl:call-template> 
    </xsl:template> 
    <xsl:template match="*[parent::cb:tire]"> 
    <xsl:choose> 
     <xsl:when test="not(text())"> 
     <xsl:apply-templates select="*"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:call-template name="field"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 
    <xsl:template name="field"> 
    <xsl:param name="name" select="name()"/> 
    <xsl:param name="value" select="text()"/> 
    <doc> 
     <field name="{$name}"> 
     <xsl:value-of select="$value"/> 
     </field> 
    </doc> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

XML:

<products> 
    <tire trademark="1E" model="HP" season="1" product-type="tire" 
    id="details/1E-HP" host="fe" 
    hostDetailId="details/205" hostDbID="7"> 
    <price>51.95</price> 
    <currency>€</currency> 
    <vat>true</vat> 
    <content>no description</content> 
    </tire> 
    <tire trademark="FIRNE" model="FHSZ90u*" season="1" product-type="tire" 
    id="details/FIRNE-FHSZ90u*" host="fe" 
    hostDetailId="details/205" hostDbID="7"> 
    <price>72.95</price> 
    <currency>€</currency> 
    <vat>true</vat> 
    <content>no description</content> 
    </tire> 
</products> 

результат должен быть. пример:

<docs> 
    <doc> 
    <field name="hostDbID">15</field> 
    .... 
    </docs> 
    <doc> 
    <field name="hostDbID">15</field> 
    .... 
    </docs> 
    <doc> 
    <field name="hostDbID">15</field> 
    .... 
    </docs> 
</doc> 

Проблема не в атрибутах и ​​элементах "macth". шаблон неправильный ?.

<xsl:template name="field"> 
    <xsl:param name="name" select="name()"/> 
    <xsl:param name="value" select="text()"/> 
    <doc> 
     <field name="{$name}"> 
     <xsl:value-of select="$value"/> 
     </field> 
    </doc> 
    </xsl:template> 

Спасибо.

ответ

1

Есть много вопросов, предотвращающие мне дать ответ с уверенностью:

  • Ваш ожидаемый результат XML имеет неверный формат (например, вы не закрываете <doc> элемент с <docs> элементом).
  • Я не понимаю, почему 15 когда-либо будет действительным значением <field name="hostDbID"> (на основе вашего исходного кода источника XML).
  • Наконец, помещение .... внутри вашего ожидаемого XML - это никогда не - хорошая идея, поскольку это заставляет нас угадать, что вы хотите.

Это моя лучшая попытка предоставить информацию. Дайте мне знать, если я ошибаюсь, и я сделаю все возможное, чтобы помочь.

Когда XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output omit-xml-declaration="no" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*"> 
    <docs> 
     <xsl:apply-templates/> 
    </docs> 
    </xsl:template> 

    <xsl:template match="tire"> 
    <doc> 
     <xsl:apply-templates select="@*|node()"/> 
    </doc> 
    </xsl:template> 

    <xsl:template match="tire/@*"> 
    <field name="{name()}"> 
     <xsl:value-of select="."/> 
    </field> 
    </xsl:template> 

</xsl:stylesheet> 

... применяется к предоставленному XML:

<products> 
    <tire trademark="1E" model="HP" season="1" product-type="tire" 
    id="details/1E-HP" host="fe" 
    hostDetailId="details/205" hostDbID="7"> 
    <price>51.95</price> 
    <currency>€</currency> 
    <vat>true</vat> 
    <content>no description</content> 
    </tire> 
    <tire trademark="FIRNE" model="FHSZ90u*" season="1" product-type="tire" 
    id="details/FIRNE-FHSZ90u*" host="fe" 
    hostDetailId="details/205" hostDbID="7"> 
    <price>72.95</price> 
    <currency>€</currency> 
    <vat>true</vat> 
    <content>no description</content> 
    </tire> 
</products> 

... что я предположить является правильным выход произведено:

<?xml version="1.0" encoding="UTF-8"?><docs> 
    <doc> 
    <field name="trademark">1E</field> 
    <field name="model">HP</field> 
    <field name="season">1</field> 
    <field name="product-type">tire</field> 
    <field name="id">details/1E-HP</field> 
    <field name="host">fe</field> 
    <field name="hostDetailId">details/205</field> 
    <field name="hostDbID">7</field> 
    <price>51.95</price> 
    <currency>€</currency> 
    <vat>true</vat> 
    <content>no description</content> 
    </doc> 
    <doc> 
    <field name="trademark">FIRNE</field> 
    <field name="model">FHSZ90u*</field> 
    <field name="season">1</field> 
    <field name="product-type">tire</field> 
    <field name="id">details/FIRNE-FHSZ90u*</field> 
    <field name="host">fe</field> 
    <field name="hostDetailId">details/205</field> 
    <field name="hostDbID">7</field> 
    <price>72.95</price> 
    <currency>€</currency> 
    <vat>true</vat> 
    <content>no description</content> 
    </doc> 
</docs> 
Смежные вопросы