我有一个必须为 solr 形成的 XSL。xslt 应该对我创建的其他 xml 有效。
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>
问题不在于“math”不同的属性和元素。模板不正确?
<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>
谢谢。