Учитывая следующее Xml:Удаление повторяющихся узлов с выхода Xsl
<record>
<category>Sport/Racket Sports/Tennis</category>
<category>Sport/Racket Sports/Badminton</category>
</record>
Я пытаюсь разбить категории, так что следующий Xml производится:
<add>
<doc>
<field name="category_0">Sport</field>
<field name="category_1">Sport/Racket Sports</field>
<field name="category_2">Sport/Racket Sports/Tennis</field>
<field name="category_2">Sport/Racket Sports/Badminton</field>
</doc>
</add>
мне удалось производят что-то, что почти есть .. Мне теперь нужен способ удаления дубликатов? Есть идеи?
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="record">
<add>
<doc>
<xsl:for-each select="category[. != '']">
<xsl:call-template name="split-cats">
<xsl:with-param name="prefix" select="''"/>
<xsl:with-param name="text" select="."/>
<xsl:with-param name="level" select="number(0)"/>
</xsl:call-template>
</xsl:for-each>
</doc>
</add>
</xsl:template>
<xsl:template name="split-cats">
<xsl:param name="text" select="."/>
<xsl:param name="prefix"/>
<xsl:param name="level" select="0"/>
<xsl:choose>
<xsl:when test="contains($text, '/')">
<field>
<xsl:attribute name="name">
<xsl:text>category_</xsl:text><xsl:value-of select="$level"/>
</xsl:attribute>
<xsl:value-of select="concat($prefix, substring-before($text, '/'))"/>
</field>
<xsl:call-template name="split-cats">
<xsl:with-param name="prefix" select="concat($prefix, concat(substring-before($text, '/'), '/'))"/>
<xsl:with-param name="text" select="substring-after($text, '/')"/>
<xsl:with-param name="level" select="$level + 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<field>
<xsl:attribute name="name">
<xsl:text>category_</xsl:text><xsl:value-of select="$level"/>
</xsl:attribute>
<xsl:value-of select="concat($prefix, $text)"/>
</field>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Этот шаблон производит:
<add>
<doc>
<field name="category_0">Sport</field>
<field name="category_1">Sport/Racket Sports</field>
<field name="category_2">Sport/Racket Sports/Tennis</field>
<field name="category_0">Sport</field>
<field name="category_1">Sport/Racket Sports</field>
<field name="category_2">Sport/Racket Sports/Badminton</field>
</doc>
</add>
Который, как вы можете видеть, есть Sport
и Sport/Racket Sports
там дважды :(
FYI: Мне нужно, чтобы иметь возможность сделать это с помощью XSLT 1.0
С благодарностью
Dave
Пожалуйста, , в отдельном вопросе объясните, какие требования/правила для производства продукции (в частности, неясно, как имена категорий должны быть сформированы). Я думаю, что может быть создано более простое решение, и проблему дублирования можно вообще избежать. –
Ах да .. извините, номер представляет собой «уровень» категории, где «0» является корневым уровнем .. в этом случае «Спорт» и «1» - это первый уровень подкатегории, 2 - второй уровень подкатегории и т. д. Это обозначение, которое используется для отправки документа в Solr. Посмотрите на третий вариант в этом электронном письме http://search.lucidimagination.com/search/document/8a14673728e3a722/implementing_hierarchical_facet – CraftyFella