如何根据XSLT 2.0中的子元素检索特定的XML元素?
问题描述:
这是我的XML文档(小片段)。如何根据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>
但它不工作...
请指导我摆脱这个问题。
答
假设你使用的是自上而下的递归下降与XSL经典时尚XSLT处理这样的:应用的模板,然后顺便排除AW,R有一女:PICT孩子是这样的:
<xsl:template match="w:r[w:pict]"/>
我似乎记得对面,我想排除W A的情况下未来:R如果它唯一的子元素是一个宽:PICT。在这种情况下,解决办法是
<xsl:template match="w:r[w:pict and count(*)=1]"/>
答
您还可以使用过滤检索那些没有w:pict
元素的所有w:r
节点
<xs:for-each select="//w:r[count(w:pict) = 0]">
<xsl:value-of select="w:paragraph" />
</xsl:for-each>
文本“我不需要这种”被包含在一个'',''不包含孩子''。你能再澄清一下你的要求吗?这听起来像你需要检查祖先元素,而不是子元素。 –
2011-12-21 08:41:36
@TimC:是的tim.I想要得到的值,其祖先不等于。 –
Saravanan
2011-12-21 09:03:39