Xslt 如何在同一行中报告来自父级和子级的数据?从随机子级开始?

Xslt 如何在同一行中报告来自父级和子级的数据?从随机子级开始?,xslt,Xslt,我需要在文件中报告reporting:folder的级别1和级别2的名称和标识。对于报告:行的每一行,它需要报告正确的前2级文件夹。理想情况下,它应该首先报告所有顶级文件夹详细信息,然后报告第二级文件夹详细信息,最后报告所有子级中的所有报告:行。因此,输出将类似于: top level folder,2nd level folder,current level folder,name,ident test00,test00,test00,test00,2 test10,test10,test

我需要在文件中报告
reporting:folder
的级别1和级别2的名称和标识。对于
报告:行的每一行,它需要报告正确的前2级文件夹。理想情况下,它应该首先报告所有顶级文件夹详细信息,然后报告第二级文件夹详细信息,最后报告所有子级中的所有
报告:行
。因此,输出将类似于:

top level folder,2nd level folder,current level folder,name,ident  
test00,test00,test00,test00,2
test10,test10,test10,test10,10
test00,test00,test0,test0,31
test10,test10,test11,test11,11
test00,test0,test1,test2,-32 
test00,test0,test1,test3,1
test10,test11,test13,test14,56
不确定如何告诉代码从reporting:行返回到level 1和level 2文件夹以在文件中报告它们。非常感谢

xml文件如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<reporting:root xmlns:reporting="TEST"> 

  <reporting:default0 reporting:type="TEST"> 
    <reporting:header> 
      <reporting:property>TEST</reporting:property>      
    </reporting:header> 
    <reporting:window reporting:Id="1" reporting:level="0" reporting:name="TEST" reporting:parentId="-1"> 
      <reporting:folder reporting:Id="2" reporting:level="1" reporting:name="name1" reporting:parentId="1"> 
 <reporting:name>test00</reporting:name> 
        <reporting:ident>2</reporting:ident> 
        <reporting:folder reporting:Id="3" reporting:level="2" reporting:name="name2" reporting:parentId="2"> 
   <reporting:name>test0</reporting:name> 
          <reporting:ident>31</reporting:ident> 
          <reporting:folder reporting:Id="4" reporting:level="3" reporting:name="name3" reporting:parentId="3"> 
            <reporting:name>test1</reporting:name> 
            <reporting:ident>4</reporting:ident> 
            <reporting:line reporting:Id="676" reporting:level="4" reporting:name="name4" reporting:parentId="4"> 
       <reporting:name>test2</reporting:name> 
              <reporting:ident>-32</reporting:ident> 
            </reporting:line> 
            <reporting:line reporting:Id="661" reporting:level="4" reporting:name="name5" reporting:parentId="4"> 
              <reporting:name>test3</reporting:name> 
              <reporting:ident>1</reporting:ident> 
            </reporting:line> 
          </reporting:folder> 
          <reporting:folder reporting:Id="5" reporting:level="3" reporting:name="name6" reporting:parentId="3"> 
            <reporting:name>test4</reporting:name> 
            <reporting:ident>5</reporting:ident> 
            <reporting:folder reporting:Id="6" reporting:level="4" reporting:name="name7" reporting:parentId="5"> 
              <reporting:name>test5</reporting:name> 
              <reporting:ident>6</reporting:ident> 
              <reporting:folder reporting:Id="7" reporting:level="5" reporting:name="name8" reporting:parentId="6"> 
                <reporting:name>test6</reporting:name> 
                <reporting:ident>7</reporting:ident> 
                <reporting:folder reporting:Id="8" reporting:level="6" reporting:name="name9" reporting:parentId="7"> 
                  <reporting:name>test7</reporting:name> 
                  <reporting:ident>8</reporting:ident> 
                  <reporting:folder reporting:Id="9" reporting:level="7" reporting:name="name10" reporting:parentId="8"> 
                    <reporting:name>test8</reporting:name> 
                    <reporting:ident>9</reporting:ident> 
                  </reporting:folder> 
                </reporting:folder> 
              </reporting:folder> 
            </reporting:folder> 
          </reporting:folder> 
        </reporting:folder> 
      </reporting:folder> 
      <reporting:folder reporting:Id="10" reporting:level="1" reporting:name="name11" reporting:parentId="1"> 
        <reporting:name>test10</reporting:name> 
        <reporting:ident>10</reporting:ident> 
        <reporting:folder reporting:Id="11" reporting:level="2" reporting:name="name12" reporting:parentId="10"> 
          <reporting:name>test11</reporting:name> 
          <reporting:ident>11</reporting:ident> 
          <reporting:folder reporting:Id="12" reporting:level="3" reporting:name="name13" reporting:parentId="11"> 
            <reporting:name>test12</reporting:name> 
            <reporting:ident>12</reporting:ident> 
            <reporting:folder reporting:Id="13" reporting:level="4" reporting:name="name14" reporting:parentId="12"> 
              <reporting:name>test13</reporting:name> 
              <reporting:ident>13</reporting:ident> 
              <reporting:line reporting:Id="160" reporting:level="5" reporting:name="name15" reporting:parentId="13"> 
                <reporting:name>test14</reporting:name> 
                <reporting:ident>56</reporting:ident> 
              </reporting:line> 
            </reporting:folder> 
          </reporting:folder> 
        </reporting:folder> 
      </reporting:folder> 
    </reporting:window> 
  </reporting:default0> 

</reporting:root> 

试验
测试00
2.
测试0
31
测试1
4.
测试2
-32 
测试3
1.
测试4
5.
测试5
6.
测试6
7.
测试7
8.
测试8
9
测试10
10
测试11
11
测试12
12
测试13
13
测试14
56
此样式表:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:r="TEST">
    <xsl:output method="text"/>
    <xsl:template match="text()"/>
    <xsl:template match="r:line|r:folder[@r:level=1 or @r:level=2]">
        <xsl:value-of select="concat(ancestor-or-self::r:folder
                                                          [last()]/r:name,
                                     ',',
                                     (ancestor-or-self::r:folder
                                        [position() >= last()-1])
                                                          [last()]/r:name,
                                     ',',
                                     ancestor-or-self::r:folder[1]/r:name,
                                     ',',
                                     r:name,
                                     ',',
                                     r:ident,
                                     '&#xA;')"/>
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>
编辑:倒数第二个祖先的更好表达方式(避免一级文件夹的子文件夹出现问题)

此样式表:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:r="TEST">
    <xsl:output method="text"/>
    <xsl:template match="text()"/>
    <xsl:template match="r:line|r:folder[@r:level=1 or @r:level=2]">
        <xsl:value-of select="concat(ancestor-or-self::r:folder
                                                          [last()]/r:name,
                                     ',',
                                     (ancestor-or-self::r:folder
                                        [position() >= last()-1])
                                                          [last()]/r:name,
                                     ',',
                                     ancestor-or-self::r:folder[1]/r:name,
                                     ',',
                                     r:name,
                                     ',',
                                     r:ident,
                                     '&#xA;')"/>
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

编辑:倒数第二个祖先的更好表达(避免一级文件夹的posible
子级出现问题)

请使用
101010
按钮正确格式化代码块和`用于内联代码段。请使用
101010
按钮正确格式化代码块和`用于内联代码段。Alejandro,我能说什么?你太棒了!!这正是我需要的!。一百万泰铢。@肯:你真是太棒了!随便问,亚历杭德罗,我能说什么?你太棒了!!这正是我需要的!。一百万泰铢。@肯:你真是太棒了!随时问。