Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 筛选组织结构图结果-层次结构的不同深度_Xml_Xslt_Filter_Organizational Chart - Fatal编程技术网

Xml 筛选组织结构图结果-层次结构的不同深度

Xml 筛选组织结构图结果-层次结构的不同深度,xml,xslt,filter,organizational-chart,Xml,Xslt,Filter,Organizational Chart,我希望你能在这个问题上给我指出正确的方向。我正试图从我们的组织结构图中得到一个过滤结果,以显示每个部门。下面是源xml的一个示例。如果有更好的方法可以根据我的需求重构xml源代码,那么我可以重构它 源XML: <OrgTree> <employee ID="1"> <Name>John</Name> <Department>President's Office</Department>

我希望你能在这个问题上给我指出正确的方向。我正试图从我们的组织结构图中得到一个过滤结果,以显示每个部门。下面是源xml的一个示例。如果有更好的方法可以根据我的需求重构xml源代码,那么我可以重构它

源XML:

<OrgTree>
    <employee ID="1">
        <Name>John</Name>
        <Department>President's Office</Department>
        <employee ID="2">
            <Name>Ron</Name>
            <Department>President's Office</Department>
            <employee ID="3">
                <Name>Don</Name>
                <Department>CEO</Department>
            </employee>
        </employee>
        <employee ID="4">
            <Name>Mike</Name>
            <Department>Finance</Department>
            <employee ID="5">
                <Name>Mark</Name>
                <Department>Accounting</Department>
                <employee ID="6">
                    <Name>Marni</Name>
                    <Department>Accounting</Department>
                </employee>
            </employee>
            <employee ID="7">
                <Name>Mindy</Name>
                <Department>Investments</Department>
            </employee>
        </employee>
    </employee>
</OrgTree>  
<OrgTree>
    <employee ID="4">
        <Name>Mike</Name>
        <Department>Finance</Department>
        <employee ID="5">
        <Name>Mark</Name>
            <Department>Accounting</Department>
            <employee ID="6">
                <Name>Marni</Name>
                <Department>Accounting</Department>
            </employee>
        </employee>
        <employee ID="7">
        <Name>Mindy</Name>
        <Department>Investments</Department>
        </employee>
    </employee>
</OrgTree>
<OrgTree>
<employee ID="5">
    <Name>Mark</Name>
    <Department>Accounting</Department>
    <employee ID="6">
        <Name>Marni</Name>
        <Department>Accounting</Department>
    </employee>
</employee>
</OrgTree>

约翰
总统办公室
罗恩
总统办公室
唐
首席执行官
迈克
财务
做记号
会计
玛尼
会计
明蒂
投资
我想得到两种不同形式的输出

  • 按部门筛选并获取该部门和子部门的所有节点(按财务树筛选) 输出1:

    <OrgTree>
        <employee ID="1">
            <Name>John</Name>
            <Department>President's Office</Department>
            <employee ID="2">
                <Name>Ron</Name>
                <Department>President's Office</Department>
                <employee ID="3">
                    <Name>Don</Name>
                    <Department>CEO</Department>
                </employee>
            </employee>
            <employee ID="4">
                <Name>Mike</Name>
                <Department>Finance</Department>
                <employee ID="5">
                    <Name>Mark</Name>
                    <Department>Accounting</Department>
                    <employee ID="6">
                        <Name>Marni</Name>
                        <Department>Accounting</Department>
                    </employee>
                </employee>
                <employee ID="7">
                    <Name>Mindy</Name>
                    <Department>Investments</Department>
                </employee>
            </employee>
        </employee>
    </OrgTree>  
    
    <OrgTree>
        <employee ID="4">
            <Name>Mike</Name>
            <Department>Finance</Department>
            <employee ID="5">
            <Name>Mark</Name>
                <Department>Accounting</Department>
                <employee ID="6">
                    <Name>Marni</Name>
                    <Department>Accounting</Department>
                </employee>
            </employee>
            <employee ID="7">
            <Name>Mindy</Name>
            <Department>Investments</Department>
            </employee>
        </employee>
    </OrgTree>
    
    <OrgTree>
    <employee ID="5">
        <Name>Mark</Name>
        <Department>Accounting</Department>
        <employee ID="6">
            <Name>Marni</Name>
            <Department>Accounting</Department>
        </employee>
    </employee>
    </OrgTree>
    
    
    迈克
    财务
    做记号
    会计
    玛尼
    会计
    明蒂
    投资
    
  • 按特定部门筛选输出,并仅获取该部门中的节点
  • 输出2:

    <OrgTree>
        <employee ID="1">
            <Name>John</Name>
            <Department>President's Office</Department>
            <employee ID="2">
                <Name>Ron</Name>
                <Department>President's Office</Department>
                <employee ID="3">
                    <Name>Don</Name>
                    <Department>CEO</Department>
                </employee>
            </employee>
            <employee ID="4">
                <Name>Mike</Name>
                <Department>Finance</Department>
                <employee ID="5">
                    <Name>Mark</Name>
                    <Department>Accounting</Department>
                    <employee ID="6">
                        <Name>Marni</Name>
                        <Department>Accounting</Department>
                    </employee>
                </employee>
                <employee ID="7">
                    <Name>Mindy</Name>
                    <Department>Investments</Department>
                </employee>
            </employee>
        </employee>
    </OrgTree>  
    
    <OrgTree>
        <employee ID="4">
            <Name>Mike</Name>
            <Department>Finance</Department>
            <employee ID="5">
            <Name>Mark</Name>
                <Department>Accounting</Department>
                <employee ID="6">
                    <Name>Marni</Name>
                    <Department>Accounting</Department>
                </employee>
            </employee>
            <employee ID="7">
            <Name>Mindy</Name>
            <Department>Investments</Department>
            </employee>
        </employee>
    </OrgTree>
    
    <OrgTree>
    <employee ID="5">
        <Name>Mark</Name>
        <Department>Accounting</Department>
        <employee ID="6">
            <Name>Marni</Name>
            <Department>Accounting</Department>
        </employee>
    </employee>
    </OrgTree>
    
    
    做记号
    会计
    玛尼
    会计
    
    我发现了几篇关于过滤的帖子,比如这篇,但我的xml结构差异太大了,所以我没有任何运气让这种方法发挥作用

    我在SharePoint中,所以我正在尝试的仅按部门筛选的xsl如下,但我没有得到任何结果,因为xml中只有一个父行。我在rowview模板中使用了许多不同的过滤方法,这是一种工作,但我只想将过滤结果传递给rowview模板,而不必迭代那里的所有节点。鉴于子节点的深度不同,我不知道如何做到这一点

    <xsl:for-each select="$Rows[Department = 'CFO']">
         <xsl:call-template name="dvt_1.rowview"/>
    </xsl:for-each>
    
    
    

    如果有任何帮助和指导,我们将不胜感激。

    您可能会从使用标识模板开始,该模板可用于复制节点而无需更改

    <xsl:template match="@*|node()" name="identity">
       <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
       </xsl:copy>
    </xsl:template>
    
    
    
    然后,您将有一个employee元素的模板,您可以在其中决定是否要复制它们。如果他们有一个部门与你想要的部门相匹配,或者有一个祖先与之匹配,那么你会复制它。否则,您将继续在子employee元素处进行处理

      <xsl:choose>
         <xsl:when test="ancestor-or-self::employee[Department=$dept]">
            <xsl:call-template name="identity"/>
         </xsl:when>
         <xsl:otherwise>
            <xsl:apply-templates select="employee"/>
         </xsl:otherwise>
      </xsl:choose>
    
    
    
    (其中,$dept是包含要筛选的部门名称的参数)

    试试这个XSLT

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output method="xml" indent="yes"/>
    
       <xsl:param name="dept" select="'Finance'"/>
    
       <xsl:template match="@*|node()" name="identity">
          <xsl:copy>
             <xsl:apply-templates select="@*|node()"/>
          </xsl:copy>
       </xsl:template>
    
       <xsl:template match="employee">
          <xsl:choose>
             <xsl:when test="ancestor-or-self::employee[Department=$dept]">
                <xsl:call-template name="identity"/>
             </xsl:when>
             <xsl:otherwise>
                <xsl:apply-templates select="employee"/>
             </xsl:otherwise>
          </xsl:choose>
       </xsl:template>
    </xsl:stylesheet>
    
    
    
    这将为您提供“输出1”。对于“输出2”,只需将条件更改为

    <xsl:when test="self::employee[Department=$dept]">
    
    
    
    或者更好的是,就这样

    <xsl:when test="Department=$dept">
    
    
    
    您几乎没有包含任何代码。也许可以试着多写一些。谢谢你的反馈。。我可以为每一个粘贴20个变体,然后选择我尝试过的语句。但它们不能按我需要的方式工作。正如我所说,我不知道如何遍历未知深度的节点。我在dvt_1.rowview中为每个员工绘制组织结构图的代码与手头的问题无关。如果代码如此敏感,那么也许这是一个你不能在公共论坛上提出的问题。试着把问题分成小块,然后你可以从中找出解决方案。谢谢Tim,我不熟悉身份模板方法。谢谢Tim,我对身份模板方法不够熟悉。这确实为我提供了我想要的输出,但我意识到,通过我逐步解决这个问题的方式,我不是在寻找xml输出,而是通过将其发送到“rowview”模板来处理过滤器的输出。我可以用它吗?嗯。。。我想你可能需要问一个全新的问题!