2011-12-16 2 views
2

Это мой документ Xml (маленький сниппт).Как проверить всех потомков :: w: p, имеющих дочерний элемент w: r/w: t моего текущего узла с помощью xslt 2.0?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
<w:body> 
<w:p> <!-- Current Node --> 
    <w:r> 
     <w:pict> 
      <w:shape> 
       <w:txbxContent> 
        <w:p> 
         <w:r> 
          <w:t>Table 11: Tanjavur NREGS activities 
          </w:t> 
         </w:r> 
        </w:p> 

        <w:p/> 
       </w:txbxContent> 
      </w:shape> 
     </w:pict> 
    </w:r> 
    <w:r> 
     <w:t>CHAPTER IV: Findings and analysis 
     </w:t> 
    </w:r> 
</w:p> 

</w:body> 
</w:document> 

Теперь просто предположим, <w:p> мой текущий Node.Now обработка, вот я хочу проверить одно условие использования. My Condition is,

Если он (текущий обрабатывающий узел) имеет более одного потомка <w:p>, то имея ребенка <w:r><w:t>, тогда только я должен выполнить некоторые функции внутри <w:when>.

теперь я испытан, как,

<xsl:choose> 
     <xsl:when test="descendant::w:p[2]"> 

       <!-- here i have to perform some work -->     
     </xsl:when> 
     <xsl:otherwise> 
     </xsl:otherwise> 
    </xsl:choose> 

В моем выше XML-документе, текущий узел обработки, имеющие два потомок <w:p>. Но только один потомок <w:p> с <w:r><w:t> ребятами. Другой потомок <w:p> - нет.

, но мое условие xslt выше, это истинный этот случай. Как проверить, имеют ли оба потомка <w:r><w:t> детей.

Пожалуйста, наставит меня, чтобы выйти из этого вопроса ...

ответ

2

Использование

<xsl:when test="count(descendant::w:p[w:r/w:t]) > 1"> 

более чем один потомок <w:p>, что наличие ребенка <w:r><w:t>

Требования к текущему узлу переведено в XPath:

  • Имеет потомок <w:p> ->descendant::w:p
  • Это <w:p> есть ребенок <w:r>, что есть ребенок <w:t> ->w:p[w:r/w:t]
  • Есть более чем один из таких потомков ->count(...) > 1
+0

:: Большое спасибо за ваш ответ. Он работает хорошо. – Saravanan

+0

+1 - Более явный подход. –

2

Если он (текущий обрабатывающий узел) имеет более одного потомка <w:p> , который имеет ребенка <w:r><w:t>, то только я должен выполнить некоторые Функции внутри <w:when>.

Более эффективное решение: использование в качестве атрибута вашей условной инструкции, или, test лучше как предикат матча патерн:

descendant::w:p[w:r/w:t][2] 

Данное выражение является true() только тогда, когда узел контекста имеет по меньшей мере двух w:p потомков, так что каждый из них имеет ребенка w:r, который сам имеет ребенка w:t.

+1

+1 - Если есть более одного, значит, есть второй. –

+0

@Dimitre Novatchev :: Большое спасибо Dimitre ... – Saravanan

+0

@Saravanan: Добро пожаловать. –

Смежные вопросы