如何在xslt 2.0中获得下一个特定节点的后续兄弟?

时间:2011-11-04 06:10:29

标签: xml xslt xpath xslt-2.0

这是我的xml文档。

<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文件转换为给定的格式。

<Document>
<Heading1>
<title>Tables</title>
<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>

我已经做了几乎所有的事情,除了下面提到的case.Assume现在当前节点是第一个<w:p>(在xml文档中提到)。所以,为了获取表项,我编码像

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

根据您的XSLT中的评论,它表明您位于 w:r 元素上,但您的XSLT代码段表明您确实位于 w:p 上元件。

假设您当前的节点 w:p ,如果您想获得其后的第一个 w:tbl 元素,您可以执行以下操作

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

然而,听起来你只想找到第一个 w:tbl 元素,如果它紧跟在 w:p 之后(即<<>后面的第一个元素< strong> w:p 是 w:tbl 元素。在这种情况下,您可能希望执行以下操作

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