过滤组织结构图结果 - 不同的层次结构深度

时间:2014-03-17 18:50:54

标签: xml xslt filter organizational-chart

我希望你能指出这个问题的正确方向。我试图获取组织结构图的过滤结果以显示每个部门。源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>  

我想以两种不同的形式获得输出。

  1. 按部门过滤并获取该部门和子部门的所有节点(按财务树过滤)。
  2. 输出1:

    <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>
    
    1. 按特定部门过滤输出,只获取该部门的节点
    2. 输出2:

      <OrgTree>
      <employee ID="5">
          <Name>Mark</Name>
          <Department>Accounting</Department>
          <employee ID="6">
              <Name>Marni</Name>
              <Department>Accounting</Department>
          </employee>
      </employee>
      </OrgTree>
      

      我发现了一些关于过滤的帖子,比如XSLT Filter result using XSLT array,但我的xml结构不同,以至于我没有运气这种方法。

      我在SharePoint中所以仅按部门过滤的xsl我尝试的是下面的,但由于xml中只有一个父行,所以没有结果。我在rowview模板中使用了许多不同的方法来进行过滤,但是我想将过滤后的结果传递给rowview模板,而不必遍历那里的所有节点。鉴于子节点的深度不同,我对如何做到这一点感到茫然。

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

      任何帮助,指导都将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

<xsl:template match="@*|node()" name="identity">
   <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
</xsl:template>

然后,您将拥有员工元素的模板,您可以在其中决定是否要复制它们。如果他们有一个部门匹配你想要的部门,或者有一个祖先和一个部门,那么你就可以复制它。否则,您将继续处理子员工元素

  <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">