Xml 查找到某一点的元素

Xml 查找到某一点的元素,xml,xslt,xpath,xslt-2.0,Xml,Xslt,Xpath,Xslt 2.0,我有一个XPath问题。我需要对中包含的任何进行测试,但不需要对中包含的任何进行测试。请注意,包含在中 XML: 添加标题 这里有一些文字 这里有更多的文字 添加另一标题 更多文本 标题 标题 添加iframe内容 添加章节标题 这里有一些章节文本 标题 标题 添加更多iframe内容 添加标题 这里有一些文字 这里有更多的文字 添加另一标题 更多文本 添加章节标题 这里有一些章节文本 标题 标题 添加更多iframe内容 XSLT: 我得到这个结果: <manifest>

我有一个XPath问题。我需要对
中包含的任何
进行测试,但不需要对
中包含的任何
进行测试。请注意,
包含在

XML:


添加标题
这里有一些文字

这里有更多的文字

添加另一标题 更多文本

标题 标题 添加iframe内容 添加章节标题 这里有一些章节文本

标题 标题 添加更多iframe内容 添加标题 这里有一些文字

这里有更多的文字

添加另一标题 更多文本

添加章节标题 这里有一些章节文本

标题 标题 添加更多iframe内容
XSLT:


我得到这个结果:

<manifest>
    <item id="p1" properties="remote-resources"/>
    <item id="p2" properties="remote-resources"/>
</manifest>

但我只想:

<manifest>
    <item id="p1" properties="remote-resources"/>
</manifest>

因为在
中没有直接的
,也没有嵌套在
中。但是,当我的XPath将选择
中的任何
时,我不确定如何实现这一点(其中包括
中的那些)

我需要选择
中包含的任何
,但不需要选择
中包含的任何

那么:

/book/part//iframe[not(ancestor::chapter)]

补充: 如果要从
部分
的上下文中测试,如果当前
部分
包含任何不是
章节
后代的
iframe
元素,请执行以下操作:

<xsl:template match="/book">
    <manifest>
        <xsl:for-each select="part">
            <item id="{@id}">
                <xsl:if test=".//iframe[not(ancestor::chapter)]">
                    <!-- code if true -->
                </xsl:if>
            </item>
        </xsl:for-each>
    </manifest>
</xsl:template>



Demo

您询问选择
iframe
s,但您的XSLT选择了
part
s?我应该将其更改为“test”条件。不幸的是,这没有得到我的预期输出。我仍然得到两个元素。对不起,你指的是什么
元素?你是指
元素吗?如果你是指
元素,你得到两个,因为你的输入中有两个
部分
元素;你的测试是在你创建了e item`。很抱歉,我指的是两个带有properties=“remote resources”的项目。不过,iframe[not(祖先::章节)]的这个新选项起到了作用!非常感谢!
/book/part//iframe[not(ancestor::chapter)]
<xsl:template match="/book">
    <manifest>
        <xsl:for-each select="part">
            <item id="{@id}">
                <xsl:if test=".//iframe[not(ancestor::chapter)]">
                    <!-- code if true -->
                </xsl:if>
            </item>
        </xsl:for-each>
    </manifest>
</xsl:template>