如何使用xslt 2.0检查所有后代:: w:p是否具有当前节点的w:r / w:t的子节点?

时间:2011-12-16 10:47:07

标签: xml xslt xpath xslt-2.0

这是我的Xml文档(小snippt)。

<?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>是没有的。

但我的上述xslt条件在这种情况下是真的。如何检查后代是否有<w:r><w:t>个孩子。

请指导我摆脱这个问题...

2 个答案:

答案 0 :(得分:2)

使用

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

有子<w:p>

的多个后代<w:r><w:t>

转换为XPath的当前节点的要求:

  • 有后代<w:p> - &gt; descendant::w:p
  • <w:p>有一个孩子<w:r>,其中有一个孩子<w:t> - &gt; w:p[w:r/w:t]
  • 这些后代不止一个 - &gt; count(...) > 1

答案 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}}子。