具有由子IN和OUT条件元素链接在一起的FILE属性。从单个FILE名称开始,就有可能获得彼此连接的所有文件“邻居”。
尝试下面的代码,如果我搜索“ 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>
继续,对于在搜索字符串中传递的每个FILE名称,它将输出列表:
A 乙 C d E
你知道我该怎么做吗?