关于xml:如何在xslt 2.0中获取特定节点的下一个立即后继兄弟?

 2021-04-09 

how to get the next immediate following-sibling of particular node in xslt2.0?

这是我的xml文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<w:document xmlns:w="w">

      <w:body>
                 <w:p>
        <w:pPr><w:pStyle w:val="Heading1"/></w:pPr>
        <w:r><w:t>Tables</w:t></w:r>  <!-- Assume Current Node here -->
                  </w:p>
                  <w:tbl>
                        <w:tr>
                               <w:tc>
                                     <w:p>
               <w:r><w:t>row1col</w:t></w:r>
                                      </w:p>
                                   </w:tc>
                               <w:tc>
                                     <w:p>
                                         <w:r><w:t>row1co2</w:t></w:r>
                                      </w:p>
                                   </w:tc>
                           </w:tr>

    <w:tr>
                               <w:tc>
                                     <w:p>
                                         <w:r><w:t>row2col1</w:t></w:r>
                                      </w:p>
                                   </w:tc>
                               <w:tc>
                                     <w:p>
                                         <w:r><w:t>row2col2</w:t></w:r>
                                      </w:p>
                                   </w:tc>
                           </w:tr>
              </w:tbl>

                 <w:p>
        <w:pPr><w:pStyle w:val="Normal"/></w:pPr>
        <w:r><w:t>2nd table</w:t></w:r>
                  </w:p>          

           <w:tbl>
                        <w:tr>
                               <w:tc>
                                     <w:p>
                                         <w:r><w:t>row11col11</w:t></w:r>
                                      </w:p>
                                   </w:tc>
                               <w:tc>
                                     <w:p>
                                         <w:r><w:t>row11co12</w:t></w:r>
                                      </w:p>
                                   </w:tc>
                           </w:tr>
        <w:tr>
                               <w:tc>
                                     <w:p>
                                         <w:r><w:t>row12col11</w:t></w:r>
                                      </w:p>
                                   </w:tc>
                               <w:tc>
                                     <w:p>
                                         <w:r><w:t>row12col12</w:t></w:r>
                                      </w:p>
                                   </w:tc>
                           </w:tr>
              </w:tbl>
</w:body>
</w:document>

因此,我想将此xml文件转换为给定格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<Document>
<Heading1>
Tables
<table>
   <paragraph>row1col1</paragraph>
   <paragraph>row1col2</paragraph>
   <paragraph>row2col1</paragraph>
   <paragraph>row2col2</paragraph>
</table>
<paragraph>2nd Table</paragraph>
<table>
   <paragraph>row11col11</paragraph>
   <paragraph>row11col12</paragraph>
   <paragraph>row12col11</paragraph>
   <paragraph>row12col12</paragraph>
</table>
</Heading1>
</Document>

除了下面提到的情况外,我几乎完成了所有工作。假设当前节点是第一个<w:p>(在xml文档中提及)。因此,为了获取表项,我将其编码为

1
2
3
4
5
6
7
8
<xsl:choose>
     <xsl:when test="following-sibling::w:tbl//w:p[w:r[w:t]]">

         <table>
              <!--some code  here -->
          </table>
       </xsl:when>
   </xsl:choose>

但是,这样做的时候,输出就像...

1
2
3
4
5
6
7
8
9
10
<table>
       <paragraph>row1col1</paragraph>
       <paragraph>row1col2</paragraph>
       <paragraph>row2col1</paragraph>
       <paragraph>row2col2</paragraph>
       <paragraph>row11col11</paragraph>
       <paragraph>row11col12</paragraph>
       <paragraph>row12col11</paragraph>
       <paragraph>row12col12</paragraph>
</table>

我想将每个表分组到单独的表节点中。我该怎么做?请指导我摆脱这个问题...


根据您XSLT中的注释,它表明您位于w:r元素上,但是您的XSLT代码段表明您实际上位于w:p元素上。

如果您要获取紧随其后的第一个w:tbl元素,则假定当前节点为w:p,则可以执行以下操作

1
<xsl:when test="following-sibling::w:tbl[1]//w:p[w:r[w:t]]">

但是,听起来好像您只想找到第一个w:tbl元素(如果它紧随w:p之后)(即,紧随w:p的第一个元素就是w:tbl元素)。在这种情况下,您可能想要执行以下

1
<xsl:when test="following-sibling::*[1][self::w:tbl]//w:p[w:r[w:t]]">