как проверить все потомки :: w: p, которые имеют дочерние элементы w: r / w: t моего текущего узла, используя xslt 2.0? - PullRequest
2 голосов
/ 16 декабря 2011

Это мой XML-документ (небольшой фрагмент).

<?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> - это мой текущий узел обработки. Теперь я хочу проверить одно условие, используя.Мое условие:

Если он (текущий узел обработки) имеет более одного потомка <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> - это никто.

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

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

Ответы [ 2 ]

2 голосов
/ 16 декабря 2011

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

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

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

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

2 голосов
/ 16 декабря 2011

Используйте

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