我希望你能指出这个问题的正确方向。我试图获取组织结构图的过滤结果以显示每个部门。源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:
<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>
输出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>
任何帮助,指导都将不胜感激。
答案 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">