Наличие атрибутов FILE, связанных между собой дочерними элементами IN и OUT. Можно было бы получить все файлы «соседей», соединенных друг с другом, начиная с одного имени ФАЙЛА.
При использовании приведенного ниже кода, если я ищу имя ФАЙЛА 'D', я получаю правильный результат, но ничего, если я ищу имя ФАЙЛА 'A'
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mf="http://example.com/mf"
exclude-result-prefixes="#all" expand-text="yes" version="3.0">
<xsl:param name="find" as="xs:string*" select="'A'"/>
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:key name="Job-by-id" match="FILE" use="@NAME"/>
<xsl:key name="outlink" match="FILE" use="IN/@NAME"/>
<xsl:function name="mf:link-chain" as="element(FILE)*">
<xsl:param name="job" as="element(FILE)"/>
<xsl:sequence
select="$job | key('outlink', $job/OUT[@SIGN = '+']/@NAME, root($job)) ! mf:link-chain(.)"/>
</xsl:function>
<xsl:key name="inlink" match="FILE" use="OUT[@SIGN = '+']/@NAME"/>
<xsl:function name="mf:link-chain-reverse" as="element(FILE)*">
<xsl:param name="job" as="element(FILE)"/>
<xsl:sequence select="$job | key('inlink', $job/IN/@NAME, root($job)) ! mf:link-chain-reverse(.)"/>
</xsl:function>
<xsl:template match="/">
<html>
<head>
<title>.NET XSLT Fiddle Example</title>
<style xsl:expand-text="no">
table {
border-collapse: collapse;
}
tbody {
border-bottom: 1px solid black;
}</style>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="DEFTABLE">
<table>
<thead>
<tr>
<th>NAME</th>
</tr>
</thead>
<xsl:apply-templates select="key('Job-by-id', $find)"/>
</table>
</xsl:template>
<xsl:template match="FILE">
<tbody>
<xsl:apply-templates select="((mf:link-chain(.)/@NAME) | (mf:link-chain-reverse(.)/@NAME))"/>
</tbody>
</xsl:template>
<xsl:template match="FILE/@NAME">
<tr>
<td>{.}</td>
</tr>
</xsl:template>
</xsl:stylesheet>
Я протестировал со следующим xml
<?xml version="1.0" encoding="utf-8"?>
<DEFTABLE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Folder.xsd">
<FILE NAME="A">
<OUT NAME="LINK01" SIGN="+" />
</FILE>
<FILE NAME="B">
<OUT NAME="LINK01" SIGN="+" />
</FILE>
<FILE NAME="C">
<IN NAME="LINK01" />
<OUT NAME="LINK02" SIGN="+" />
</FILE>
<FILE NAME="D">
<IN NAME="LINK02" />
<IN NAME="LINK03" />
</FILE>
<FILE NAME="E">
<OUT NAME="LINK03" SIGN="+" />
</FILE>
</DEFTABLE>
Продолжая, для каждого имени ФАЙЛА, переданного в строке поиска, будет выведен список:
А
В
С
D
E
Ты хоть представляешь, как я мог это сделать?