如何根据XSLT 2.0中的子元素检索特定的XML元素?

时间:2011-12-21 07:04:24

标签: xml xslt xpath xslt-2.0

这是我的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:t>
                 This is the
            </w:t>
        </w:r>
        <w:r>
            <w:pict>
                <w:p>
                    <w:r>
                        <w:t>
                            I dont need this
                        </w:t>
                    </w:r>
                </w:p>
            </w:pict>
        </w:r>

        <w:r>
            <w:pict>
                <w:p>
                    <w:r>
                        <w:t>
                            I dont need this too
                        </w:t>
                    </w:r>
                </w:p>
            </w:pict>
        </w:r>

        <w:r>
            <w:t>
                 text that i need to retrieve...
            </w:t>
        </w:r>
    </w:p>
</w:body>
</w:document>   

在这里,我想要检索<w:r><w:t>值,而<w:r>里面不应包含子<w:pict>。因此,根据我上面的XML文档,我想生成以下输出:

<paragraph>This is the text that i need to retrieve...</paragraph>

这是我的XSLT代码段(请告诉我此XSLT需要哪些更改才能获得上述格式):

<xsl:choose>
    <xsl:when test="self::w:p[//w:r/w:t[not(ancestor::w:pict)]]">

        <Paragraph>
            <xsl:apply-templates select="./w:t[not(ancestor::w:pict)]" />
        </Paragraph>
    </xsl:when>
</xsl:choose>

<xsl:template match="w:t">
    <xsl:value-of select="." />
</xsl:template>

但它不起作用......

请指导我解决这个问题。

3 个答案:

答案 0 :(得分:1)

在您当前的示例中,如果您当前的节点为/w:document/w:body/w:p,则可以使用以下命令检索所有需要的节点:

w:r/w:t

但是,如果您需要在任何级别上重试w:r/w:t但不需要w:pict作为祖先,则可以使用ancestor轴:

.//w:r/w:t[not(ancestor::w:pict)]

答案 1 :(得分:1)

假设您使用xsl:apply-templates使用自上而下的递归下降以经典的XSLT方式处理它,那么排除具有w:pict子项的w:r的方式是这样的:

<xsl:template match="w:r[w:pict]"/>

我似乎记得遇到一个案例,我想排除一个w:r,如果它唯一的子元素是w:pict。在那种情况下,解决方案将是

<xsl:template match="w:r[w:pict and count(*)=1]"/>

答案 2 :(得分:0)

您还可以使用过滤来检索所有没有w:r元素的w:pict个节点

<xs:for-each select="//w:r[count(w:pict) = 0]">
    <xsl:value-of select="w:paragraph" />
</xsl:for-each>