提取具有关系子级的属性

时间:2019-03-28 14:53:03

标签: xml xslt xpath

具有由子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

你知道我该怎么做吗?

0 个答案:

没有答案