首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在while循环中使用xslt进行深入挖掘?

在while循环中使用xslt进行深入挖掘?
EN

Stack Overflow用户
提问于 2014-11-28 08:35:08
回答 2查看 231关注 0票数 0

我想用xslt编写一个向下钻取的报告--我有以下xml:

代码语言:javascript
复制
    <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,我希望得到以下结果:

代码语言:javascript
复制
walt > pete > mike

我不跟迈克说了,因为迈克是老板。

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

代码语言:javascript
复制
sven > mike

我想在我的xslt中使用一个一直在回忆到boss="1“的模板。

但我不知道我该怎么做。有人能帮我,给我另一个可能得到我想要的结果吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-28 08:55:51

试一试如下:

XSLT1.0

代码语言:javascript
复制
<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>
票数 2
EN

Stack Overflow用户

发布于 2014-11-28 08:54:37

考虑使用xsl:key通过nb属性查找row元素

代码语言:javascript
复制
<xsl:key name="row_by_nb" match="row" use="@nb" />

假设您将nb值作为参数传入,那么首先使用键选择相关的行。

代码语言:javascript
复制
<xsl:apply-templates select="key('row_by_nb', $nb)" />

然后,在匹配row的模板中,您可以简单地输出它们的名称。然后,您可以测试它们是否有一个管理器,如果有,您可以使用键递归地调用模板。

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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>

或者这样做,这样可以避免重复使用密钥。

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27184696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档