【问题标题】:how to get the next immediate following-sibling of particular node in xslt2.0?如何在 xslt2.0 中获取特定节点的下一个直接跟随兄弟?
【发布时间】:2011-11-04 06:10:29
【问题描述】:

这是我的 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>

除了下面提到的情况外,我几乎做了所有事情。假设现在当前节点是第一个&lt;w:p&gt;(在 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>

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

【问题讨论】:

  • 你也想做其他事情。只需为每个 w:tbl 元素执行一个操作,并在需要时添加任何前面的元素。
  • @FailedDev:: 谢谢,我会努力实现你的想法。如果你找到了方法,请告诉我

标签: xml xslt xpath xslt-2.0


【解决方案1】:

从您的 XSLT 中的注释来看,它表明您位于 w:r 元素上,但您的 XSLT sn-p 表明您实际上位于 w:p 元素。

假设你当前的节点是 w:p 如果你想得到它后面的第一个 w:tbl 元素,你可以这样做

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

但是,如果第一个 w:tbl 元素紧跟在 w:p 之后(即 w:tbl 之后的第一个元素(即 w:p 是 w:tbl 元素)。在这种情况下,您可能需要执行以下操作

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

【讨论】:

  • 非常感谢蒂姆......它工作得很好。但是“第二张桌子”在桌子下面2。如何保持相同的顺序......
  • 很难说,因为您还没有展示完整的 XSLT。如果您遇到其他问题,您可能需要提出一个新问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多