Как получить следующий ближайший родственник конкретного узла в xslt2.0? - PullRequest
0 голосов
/ 04 ноября 2011

Это мой 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>

Я сделал почти все, кроме указанного ниже случая. Предположим, что текущий узел является первым <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 Ответ

2 голосов
/ 04 ноября 2011

Из комментария в вашем 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 (т. Е. Первый элемент, который следует за w: p является элементом w: tbl ). В этом случае вы, вероятно, захотите сделать следующее

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