2014-11-28 2 views
0

Я хочу сделать сверло вниз отчета с помощью XSLT У меня есть этот XML:Прокрутите вниз, используя xslt в цикле while?

<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> 

Если я выбираю, например, нб = 1, я хочу следующий результат:

walt > pete > mike 

и я остановить с микрофоном, потому что микрофон является боссом (= 1)

Если я выбрал пь = 3, то я хочу следующее:

sven > mike 

Я думал сделать в своем xslt что-то с шаблоном, который был вызван до тех пор, пока босс = "1" не был уверен, как я должен это сделать. Может ли кто-нибудь помочь мне, чтобы они дали мне еще одну возможность получить результат, который я хочу?

+0

«Если я выбираю, например, nb = 1 *« Как именно вы сделаете выбор? - P.S. Ваш XML не является корректным. –

+0

Я выберу nb = 1 в параметре url. XML не хорошо отформатирован, потому что я просто выбрал то, что было необходимо для моего вопроса. – Bigjo

+0

У вас есть две строки с атрибутом 'nb', установленным на' 2'. Это верно? Если это так, это означало бы, что у плохого старого «увядания» было два менеджера; «pete» и «maria»! –

ответ

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> 
+0

Большое спасибо, это очень помогло. Вопрос: есть ли разница в XSLT 2.0? – Bigjo

+0

@ Биджо. Нет, я так не думаю. –

1

Рассмотрим с помощью xsl:key посмотреть ваши row элементы по nb атрибута

<xsl:key name="row_by_nb" match="row" use="@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> 
Смежные вопросы