Xml 筛选组织结构图结果-层次结构的不同深度
我希望你能在这个问题上给我指出正确的方向。我正试图从我们的组织结构图中得到一个过滤结果,以显示每个部门。下面是源xml的一个示例。如果有更好的方法可以根据我的需求重构xml源代码,那么我可以重构它 源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>
<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>
约翰
总统办公室
罗恩
总统办公室
唐
首席执行官
迈克
财务
做记号
会计
玛尼
会计
明蒂
投资
我想得到两种不同形式的输出
<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>
迈克
财务
做记号
会计
玛尼
会计
明蒂
投资
<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”模板来处理过滤器的输出。我可以用它吗?嗯。。。我想你可能需要问一个全新的问题!