在while循环中使用xslt向下钻取?

时间:2014-11-28 08:35:09

标签: xml xslt

我想用xslt制作一个向下钻取报告 我有这个xml:

    <dbqueries>
    <dbquery id="pers">
        <rows>
            <row nb="1" name="walt" mgr="2" boss="0"/>
            <row nb="2" name="pete" mgr="4" boss="0"/>
            <row nb="2" name="marie" mgr="4" boss="0"/>
            <row nb="3" name="sven" mgr="4" boss="0"/>
            <row nb="4" name="mike" mgr="5" boss="1"/>
        </rows>
    </dbquery>
</dbqueries>

如果我选择例如nb = 1,我想要以下结果:

walt > pete > mike

我和迈克一起停下来,因为迈克是老板(= 1)

如果我选择nb = 3,那么我想要以下内容:

sven > mike

我想在我的xslt中做一些模板,这个模板一直在召回,直到boss =&#34; 1&#34;

但我不确定我该怎么做。有人可以帮助我,让我有另一种可能获得我想要的结果吗?

2 个答案:

答案 0 :(得分:2)

尝试类似:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>

<xsl:param name="nb" select="1"/>
<xsl:key name="row-by-nb" match="row" use="@nb" />

<xsl:template match="/">
    <xsl:apply-templates select="key('row-by-nb', $nb)"/>
</xsl:template>

<xsl:template match="row">
    <xsl:value-of select="@name"/>
    <xsl:if test="not(@boss=1)">
        <xsl:text> > </xsl:text>
        <xsl:apply-templates select="key('row-by-nb', @mgr)"/>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

考虑使用xsl:keyrow属性

查找nb个元素
<xsl:key name="row_by_nb" match="row" use="@nb" />

假设您将nb值作为参数传递,您可以通过使用键选择相关行来开始

<xsl:apply-templates select="key('row_by_nb', $nb)" />

然后,在匹配row的模板中,您只需输出其名称即可。然后,您可以测试他们是否有经理,如果是,您将使用密钥递归调用模板

<xsl:if test="key('row_by_nb', @mgr)[1]">
    <xsl:text> > </xsl:text>
    <xsl:apply-templates select="key('row_by_nb', @mgr)[1]" />
</xsl:if>

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output output="text" />

   <xsl:param name="nb" select="'1'" />
   <xsl:key name="row_by_nb" match="row" use="@nb" />

   <xsl:template match="/">
      <xsl:apply-templates select="key('row_by_nb', $nb)" />
   </xsl:template>

   <xsl:template match="row">
      <xsl:value-of select="@name" />
      <xsl:if test="key('row_by_nb', @mgr)[1]">
          <xsl:text> > </xsl:text>
          <xsl:apply-templates select="key('row_by_nb', @mgr)[1]" />
      </xsl:if>
   </xsl:template>
</xsl:stylesheet>

或许这可以避免重复使用密钥

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output output="text" />

   <xsl:param name="nb" select="'1'" />
   <xsl:key name="row_by_nb" match="row" use="@nb" />

   <xsl:template match="/">
      <xsl:apply-templates select="key('row_by_nb', $nb)" />
   </xsl:template>

   <xsl:template match="row">
      <xsl:param name="separator" select="''" />

      <xsl:value-of select="$separator" />
      <xsl:value-of select="@name" />
      <xsl:apply-templates select="key('row_by_nb', @mgr)[1]">
          <xsl:with-param name="separator" select="' > '" />
      </xsl:apply-templates>
   </xsl:template>
</xsl:stylesheet>