两条处理指令之间是否只有文本?

Is there only text between two processing instructions?

这是我的 XML 文件:

<root>
    <?pistart ?>
    <elt>
    <?pistop ?>
    </elt>
</root>

现在(使用 XPath 2.0)我想知道处理指令 pistart 和下一个处理指令 pistop 之间是否只有文本。上面的答案是 'no, there is an start element tag'。

如果没有相应的 pistoppistart 永远不会在另一个 pistart 之后出现。因此这是不可能的(如果它有助于解决我的问题):

<root>
    <?pistart ?>
    <elt>
    <?pistart ?>
    <?pistop ?>
    </elt>
    <?pistop ?>
</root>

根据我评论中的建议,我认为

<xsl:template match="/">
    <xsl:for-each-group select="/root//node()"
        group-starting-with="processing-instruction('pistart')">
        <xsl:if test="self::processing-instruction('pistart')">
            <xsl:variable name="end" select="current-group()[self::processing-instruction('pistop')]"/>
            <xsl:value-of
                select="
                every $group-member in current-group()[position() gt 1 and . &lt;&lt; $end]
                satisfies $group-member instance of text()"
            />
        </xsl:if>
    </xsl:for-each-group>
</xsl:template>

将对满足条件的任何一组 pi 对输出 true,对不满足条件的 pi 对输出 false。

嵌套一个额外的 for-each-group group-ending-with="processing-instruction('pistop')" 来抓取要检查的节点可能更容易。

也许(假设 pistart 是上下文项):

exists(following-sibling::node()[1][self::text()]
/following-sibling::node()[1][self::processing-instruction(pistop))

使用这个 XPath 1.0 表达式(当然,它也是一个 XPath 2.0 表达式)

假设 pistart 是上下文项:

boolean(following::node()[not(self::text())][1][self::processing-instruction('pistop')])