首页 > 解决方案 > XML:如何使用 XPath 获取 2 个处理指令之间的所有文本节点和节点

问题描述

<p>
    <?PI start?> Grab <span>all</span> these <span>text</span> nodes <?PI end?>
</p>

使用上面的 XML,我试图抓取两个 PI 中间的所有内容并将它们包装在一个元素中,有没有办法在 XSLT 中实现这一点?

我想要的输出是:

<p>
    <?PI start?><u> Grab <span>all</span> these <span>text</span> nodes </u><?PI end?>
</p>

标签: xmlxsltxpath

解决方案


XSLT 1.0:最好编写一个递归模板,从第一个 PI 开始并递归调用自身来处理 following-sibling::node()[1] 直到遇到结束 PI。

XSLT 2.0:将变量 $s 和 $e 绑定到两个处理指令,然后使用

p/*[. >> $s and . << $e]

XSLT 3.0:考虑xsl:iterate

<xsl:iterate select="p/processing-instruction(PI)[.='start']/following-sibling::node()">
   <xsl:if test="self::processing-instruction(PI)[.='end']">
      <xsl:break/>
   </xsl:if>
   ...
</xsl:iterate>

撒克逊人:

p/* => saxon:items-after(.{processing-instruction(PI)[.='start']})
    => saxon:items-before(.{processing-instruction(PI)[.='end']})

推荐阅读