xml - 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>
解决方案
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']})
推荐阅读
- php - 即使从数据库中删除条目后,Laravel 护照刷新令牌仍然有效
- console - 我在哪里可以找到 lite-server 的控制台日志?
- sql-server - 如何使用 SQL Server Soundex
- angularjs - 如何允许 angularJS 自定义过滤器单次操作数据
- html - 如何在 CSS3/HTML5 中将标题与视频背景的中心对齐?
- c++ - 如何将图标添加到 QGroupBox 标题?
- windows - 从win2008迁移到win2016后无法wget
- node.js - “节点 JS 安装收到错误”存储库没有发布文件“
- kotlin - Kotlin Exposed 的异常处理 - 如何捕获唯一约束违规异常?
- r - 根据条件改变列,保留原始内容