如何在XSL中检测相邻的mydata:ActionText与start_mark处理指令?
实现检测逻辑的XSLT方案
要在匹配mydata:Headings的模板中完成节点相邻检测与分支处理,可通过节点轴查询结合条件判断实现,核心思路是先判断目标节点是否存在,再验证两者是否为相邻的非空白节点:
<xsl:template match="mydata:Headings"> <!-- 定义变量:判断目标节点是否存在 --> <xsl:variable name="has-action-text" select="exists(mydata:ActionText)"/> <xsl:variable name="has-start-mark" select="exists(processing-instruction('start_mark'))"/> <!-- 检测两种相邻场景:ActionText紧跟start_mark,或start_mark紧跟ActionText(跳过空白文本节点) --> <xsl:variable name="action-after-start" select="processing-instruction('start_mark')[ following-sibling::node()[not(self::text()[normalize-space()=''])][1] [self::mydata:ActionText] ]"/> <xsl:variable name="start-after-action" select="mydata:ActionText[ following-sibling::node()[not(self::text()[normalize-space()=''])][1] [self::processing-instruction('start_mark')] ]"/> <xsl:variable name="nodes-adjacent" select="$has-action-text and $has-start-mark and ($action-after-start or $start-after-action)"/> <!-- 分支处理逻辑 --> <xsl:choose> <xsl:when test="$nodes-adjacent"> <xsl:apply-templates select="mydata:ActionText | processing-instruction('start_mark')"/> </xsl:when> <xsl:when test="$has-action-text"> <xsl:apply-templates select="mydata:ActionText"/> </xsl:when> <!-- 若需处理仅存在start_mark的场景,可在此添加xsl:when分支 --> </xsl:choose> <!-- 按需处理其他子节点,如示例中的mydata:heading1 --> <xsl:apply-templates select="mydata:heading1"/> </xsl:template>
关键细节说明
- 空白节点处理:通过
following-sibling::node()[not(self::text()[normalize-space()=''])][1]跳过XML中的换行、缩进等空白文本节点,确保仅判断有效节点的相邻关系。 - 命名空间注意:需在XSLT的根元素
xsl:stylesheet中正确声明mydata命名空间,例如:<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mydata="http://your-actual-namespace-uri"> - 分支扩展性:若需要处理仅存在
start_mark处理指令的场景,可在xsl:choose中添加对应的分支逻辑。
针对你提供的XML片段,该模板会检测到mydata:ActionText与后续的start_mark处理指令(中间仅空白节点),因此会触发第一个分支,同时处理两个节点。
内容的提问来源于stack exchange,提问作者KV MC
相关产品推荐
相关产品推荐

