-1

この問題について正しい方向に向けていただければ幸いです。各部門を表示するために、組織図のフィルター処理された結果を取得しようとしています。ソース 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>  

出力を2つの異なる形式で取得したいと思います。

  1. 部門でフィルター処理し、その部門と子部門からすべてのノードを取得します (財務ツリーでフィルター処理)。

出力 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:

<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には親行が1つしかないため、結果が得られません。私は、rowviewテンプレートでフィルターを実行するさまざまな方法を試しましたが、フィルター処理された結果をrowviewテンプレートに渡し、そこにあるすべてのノードを反復処理する必要はありません。子ノードのさまざまな深さを考えると、これを行う方法に途方に暮れています。

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

ヘルプ、ガイダンスをいただければ幸いです。

4

1 に答える 1

1

おそらく、変更なしでノードをコピーするために使用できる ID テンプレートを使用して開始することになるでしょう。

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

次に、 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">
于 2014-03-17T22:31:32.187 に答える