Я пытаюсь добиться рекурсивного (дерева) список в XSLT 1.0, начиная от XML, который выглядит следующим образом:Рекурсивного XSLT 1.0 на основе значения узла
<list>
<row>
<icon>http://server/app/icon.gif</icon>
<title>Document</title>
<location>Root\Formulier</location>
</row>
<row>
<icon>http://server/app/icon.gif</icon>
<title>Handleiding1</title>
<location>Root\Handleidingen</location>
</row>
<row>
<icon>http://server/app/icon.gif</icon>
<title>Form</title>
<location>Root\Formulier\Informed consent (IC)</location>
</row>
<row>
<icon>http://server/app/icon.gif</icon>
<title>Handleiding2</title>
<location>Root\Handleidingen</location>
</row>
</list>
Это должно использовать XSLT 1.0, потому что наш SharePoint еще не поддерживает 2.0.
Он должен выглядеть как дерево в проводнике Windows.
текущий код XSLT у меня есть:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes" />
<xsl:key name="groups" match="/list/row" use="location" />
<xsl:template match="/list">
<div class="idocument-list">
<xsl:apply-templates select="row[generate-id() = generate-id(key('groups', location)[1])]"/>
</div>
</xsl:template>
<xsl:template match="row">
<div style="margin-bottom:5px;">
<ul>
<li>
<img border="0" style="align:left;" src="/_layouts/15/images/folder.gif?rev=23" alt="map" />
<span class="ms-textLarge idocumentlist-title">
<xsl:value-of select="substring-after(location,'Root\')"/>
</span>
<ul style="display:none;">
<xsl:for-each select="key('groups', location)">
<li>
<img border="0" style="align:left;">
<xsl:attribute name="src">
<xsl:value-of select="icon"/>
</xsl:attribute>
</img>
<span>
<a>
<xsl:attribute name="href">
<xsl:value-of select="link"/>
</xsl:attribute>
<xsl:value-of select="title"/>
</a>
</span>
</li>
</xsl:for-each>
</ul>
</li>
</ul>
</div>
</xsl:template>
</xsl:stylesheet>
, который показывает результат, как:
Где, например 'Formulier \ информированное согласие (IC)' показывает все папки после друг друга, в то время как он должен быть разделен на \ и показывать «Формуляр» в качестве родителя «Информированное согласие (IC)». (I substringed местоположение «Root \», но он должен показать на вершине как корневой узел)
Пример кода результата:
<div class="idocument-list">
<ul>
<li>
<img style="align: left;" alt="map" src="..." border="0">
<span class="ms-textLarge idocumentlist-title">Root</span>
<ul>
<li>
<img style="align: left;" alt="map" src="..." border="0">
<span class="ms-textLarge idocumentlist-title">Formulier</span>
<ul>
<li>
<img style="align: left;" alt="map" src="..." border="0">
<span class="ms-textLarge idocumentlist-title">Informed consent (IC)</span>
<ul>
<li>
<img style="align: left;" src="..." border="0">
<span>
<a href="...">Form</a>
</span>
</li>
</ul>
</li>
<li>
<img style="align: left;" alt="map" src="..." border="0">
<span>
<a href="...">Document</a>
</span>
</li>
</ul>
</li>
<li>
<img style="align: left;" alt="map" src="..." border="0">
<span class="ms-textLarge idocumentlist-title">Handleidingen</span>
<ul>
<li>
<img style="align: left;" src="..." border="0">
<span>
<a href="...">Handleiding1</a>
</span>
</li>
<li>
<img style="align: left;" src="..." border="0">
<span>
<a href="...">Handleiding2</a>
</span>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
Может кто-нибудь дать мне источник информации или кода, чтобы играть в добиться чего-то подобного с помощью только XSLT 1.0?
Заранее спасибо.
Nils
Пожалуйста, покажите ожидаемый результат ** как код **. –
Плохо, я добавил пример! – AppSum
Это почти такой же вопрос, как и этот: http: // stackoverflow.com/questions/872067/create-a-nested-tree-structure-from-a-path-in-xslt – Tomalak