У меня есть данные XML в следующей форме:
<table>
<col>
<name>Addresses</name>
</col>
<col>
<name>Addresses/Address1</name>
</col>
<col>
<name>Addresses/Address2</name>
</col>
<col>
<name>Addresses/Address1/Flat Number</name>
</col>
<col>
<name>Employee Name</name>
</col>
<col>
<name>Phone Number</name>
</col>
<col>
<name>Profession</name>
</col>
<col>
<name>Employee Name/First Name</name>
</col>
<col>
<name>Employee Name/Last Name</name>
</col>
<col>
<name>Employee Name/First_Name</name>
</col>
<col>
<name>Accounts/Account Name/First/Saving</name>
</col>
<col>
<name>Accounts/Account_Name/Second</name>
</col>
</table>
Теперь я хочу создать древовидную структуру в HTML, используя XSLT для этого XML.Структура Treeview будет похожа на следующую структуру:
- Адреса
- Имя сотрудника
- Счета
Обратите внимание, что подстрока перед первым появлением "/" является узлом первого уровня древовидной структуры, а подстрока после первого появления "/" является узлом второго уровня соответствующего узла первого уровня, и это только 2 уровняtreeview.
Кроме того, отображаемые значения являются уникальными.Даже если значения повторяются в XML, нам нужно выбрать только одно уникальное значение.Еще одно условие, которое следует учитывать, это то, что значения с «» считаются такими же, как и без «», как указано в примере: «Имя» и «Имя_Имя», поэтому нам необходимо отобразить значение после замены «-»с "".
<xsl:variable name="currentNode" select="//table/col" />
<xsl:key name="uniqueCategoryKey" match="record" use="name"/>
<xsl:key name="uniqueSubCategoryKey" match="record" use="substring-before(substring-after(concat(name,'/'),'/'),'/')"/>
<xsl:template match="/">
<xsl:call-template name="treeTemplate" />
</xsl:template>
<xsl:template name="treeTemplate">
<div id ="newtreeview">
<ul>
<xsl:for-each select="$currentNode[generate-id() = generate-id(key('uniqueCategoryKey', name))]">
<xsl:variable name="category" select="name"/>
<xsl:if test="string-length($category) > 0 and not(contains($category,'/'))">
<li>
<a href="#">
<xsl:value-of select="$category"/>
</a>
<xsl:if test="//record[contains(name, concat($category,'/'))]">
<ul>
<xsl:for-each select="$currentNode[generate-id() = generate-id(key('uniqueSubCategoryKey', substring-before(substring-after(concat(name,'/'),'/'),'/')))]">
<li>
<a href="#">
<xsl:variable name="subcat">
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="string(substring-before(substring-after(concat(name,'/'),'/'),'/'))" />
<xsl:with-param name="replace" select="'_'" />
<xsl:with-param name="by" select="' '" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$subcat"/>
</a>
</li>
</xsl:for-each>
</ul>
</xsl:if>
</li>
</xsl:if>
</xsl:for-each>
</ul>
</div>
</xsl:template>
<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="by" />
<xsl:choose>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text,$replace)" />
<xsl:value-of select="$by" />
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text"
select="substring-after($text,$replace)" />
<xsl:with-param name="replace" select="$replace" />
<xsl:with-param name="by" select="$by" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Проблема в том, что этот код дает мне вывод типа
- Адреса
- Имя сотрудника
- Счета
- Имя учетной записи
- Имя учетной записи
Пожалуйста, помогите мне решить эту проблему.
Заранее спасибо.