首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

XSLT:如何将第一个同级替换为所有同级的串联?

XSLT(Extensible Stylesheet Language Transformations)是一种用于将XML文档转换为其他格式的语言。它是一种基于XML的编程语言,用于定义和执行XML文档的转换过程。

对于将第一个同级替换为所有同级的串联,可以使用XSLT中的递归和条件语句来实现。下面是一个示例XSLT代码:

代码语言:txt
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <!-- 递归模板 -->
  <xsl:template name="concatenate-siblings">
    <xsl:param name="current-node"/>
    <xsl:param name="result" select="''"/>

    <!-- 终止条件:当前节点为最后一个同级节点 -->
    <xsl:if test="not($current-node/following-sibling::*)">
      <xsl:value-of select="concat($result, $current-node)"/>
    </xsl:if>

    <!-- 递归调用:将下一个同级节点添加到结果中 -->
    <xsl:if test="$current-node/following-sibling::*">
      <xsl:call-template name="concatenate-siblings">
        <xsl:with-param name="current-node" select="$current-node/following-sibling::*[1]"/>
        <xsl:with-param name="result" select="concat($result, $current-node, ', ')"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

  <!-- 匹配需要替换的节点 -->
  <xsl:template match="replace-node">
    <xsl:copy>
      <!-- 调用递归模板 -->
      <xsl:call-template name="concatenate-siblings">
        <xsl:with-param name="current-node" select="."/>
      </xsl:call-template>
    </xsl:copy>
  </xsl:template>

  <!-- 其他节点保持不变 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

上述代码中,我们定义了一个名为concatenate-siblings的递归模板,它接受两个参数:current-node表示当前节点,result表示已经串联的节点结果。在模板中,我们首先判断当前节点是否为最后一个同级节点,如果是,则将结果输出;否则,将下一个同级节点添加到结果中,并递归调用自身。

然后,我们定义了一个匹配replace-node节点的模板,在该模板中调用了concatenate-siblings模板来替换该节点。

最后,我们定义了一个保持其他节点不变的模板,以确保未匹配到的节点保持原样。

这样,当应用上述XSLT转换样式表到XML文档时,所有匹配到的replace-node节点将被替换为其同级节点的串联结果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

XPath语法_java中path作用

preceding 直到所有这个节点父辈节点,顺序选择每个父辈节点前所有同级节点 preceding-sibling 选取当前节点之前所有同级节点。 self 选取当前节点。...() 第一个message节点下所有子节点 /messages/message[1]/*[last()] 第一个message节点最后一个子节点 /messages/message[1]/[last...text() 第一个message节点所有子节点 /messages/message[1]//text() 第一个message节点下递归下降查找所有的文本节点(无限深度) /messages/message.../messages/message[1]/sender/following::* 查找第一个message节点sender节点后所有同级节点,并对每一个同级节点递归向下查找。...(查找顺序为:先找到body节点顶级节点(根节点),得到根节点标签前所有同级节点,执行完成后继续向下一级,顺序得到该节点标签前所有同级节点,依次类推。)

8.8K20

XML文档节点导航与选择指南

XSLT主要组成部分: XPath是XSLT(可扩展样式表语言转换)标准主要组成部分,用于在XML文档中选择和操作数据XPath路径表达式XPath使用路径表达式来选择XML文档中节点或节点集。...XPath用于XSLTXPath是XSLT标准主要组成部分,它与XSLT一起用于对XML文档进行转换和样式处理。...同级节点(Sibling Node): 具有相同父节点节点。祖先节点(Ancestor Node): 节点父节点、父节点父节点等。...following-sibling: 选择当前节点之后所有同级节点。namespace: 选择当前节点所有命名空间节点。parent: 选择当前节点父节点。...preceding: 选择文档中在当前节点之前出现所有节点,但不包括祖先、属性节点和命名空间节点。preceding-sibling: 选择当前节点之前所有同级节点。self: 选择当前节点。

10400
  • XPath知识点梳理

    preceding 选取文档中当前节点开始标签之前所有节点。 preceding-sibling 选取当前节点之前所有同级节点。 self 选取当前节点。 ?...[last()] 第一个message节点最后一个子节点 /messages/message[1]/text() 第一个message节点所有子节点 /messages/message[1]//text.../messages/message[1]/sender/following::* 查找第一个message节点sender节点后所有同级节点,并对每一个同级节点递归向下查找。...(查找顺序为:先找到body节点顶级节点(根节点),得到根节点标签前所有同级节点,执行完成后继续向下一级,顺序得到该节点标签前所有同级节点,依次类推。)...注意:查找同级节点是顺序查找,而不是递归查找。 //message[@id=0]/body/preceding-sibling::node() 顺序查找body标签前所有同级节点。

    1.1K40

    XPath定位深入学习(二)

    XPath 是 W3C XSLT 标准主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。     ...选取当前节点所有后代元素(子、孙等)      4、ancestor  选取当前节点所有先辈(父、祖父等)      5、descendant-or-self  选取当前节点所有后代元素(子、孙等...)以及当前节点本身      6、ancestor-or-self  选取当前节点所有先辈(父、祖父等)以及当前节点本身      7、preceding-sibling 选取当前节点之前所有同级节点...     8、following-sibling 选取当前节点之后所有同级节点      9、preceding   选取文档中当前节点开始标签之前所有节点      10、following  ...选取文档中当前节点结束标签之后所有节点      11、self  选取当前节点      12、attribute  选取当前节点所有属性      13、namespace 选取当前节点所有命名空间节点

    75110

    10 个解放双手 IDEA插件,少些冤枉代码(第三弹)

    2、Cool RequestCool Request是一款基于IDEAHTTP调试工具,可以看成是轻量版postman,它会自动扫描项目代码中所有API路径,按项目分组管理。...4、any-ruleany-rule是一个正则表达式字典库,尽管在日常开发中其使用频率可能不是特别高,但它无疑是一个极为实用工具。它涵盖了广泛正则表达式类型,几乎包括了你能想到所有规则。...验证一下不同级别的日志在控制台输出情况,不同级别显示不同颜色,这样在控制台查看日志就一目了然了。...对象转换为DTO对象。...9、TONGYI Lingma通义灵码是阿里推出一款AI编程插件,经过我实际体验后,勉勉强强可以平GPT、Copilot,更重要是它免费!

    2.8K10

    jQuery选择集转移

    选择集转移操作 $('#box').prev(); 表示选择id是box元素上一个同级元素 $('#box').prevAll(); 表示选择id是box元素上面所有同级元素 $('#box')....next(); 表示选择id是box元素下一个同级元素 $('#box').nextAll(); 表示选择id是box元素下面所有同级元素 $('#box').parent(); 表示选择id...是box元素父元素 $('#box').children(); 表示选择id是box元素所有子元素 $('#box').siblings(); 表示选择id是box元素其它同级元素 $('#box...小结 prev() 表示获取上一个同级元素 prevAll() 表示获取上面所有同级元素 next() 表示获取下一个同级元素 nextAll() 表示获取下面所有同级元素 parent() 表示获取父元素...children() 表示获取所有的子元素 siblings() 表示获取其它同级元素 find("选择器名称") 表示获取指定选择器元素

    30.9K75

    Cypress 页面元素基本操作方式

    .parents() 用来获取DOM元素所有父元素 .parent() 用来获取DOM元素第一层元素 .siblings() 用来获取DOM元素所有同级元素 .first() 用来获取指定DOM对象第一个元素....last() 用来获取指定DOM对象最后一个元素 .next() 用来匹配DOM对象紧跟着下一个同级元素 .nextAll() 用来匹配给定DOM对象所有同级元素 .nextUntil()...用来匹配给定DOM对象之后所有同级元素直到遇到Until里定义元素为止 .prev() 用来匹配给定DOM对象紧跟着上一个同级元素 .prevAll() 用来匹配给定DOM对象之前所有同级元素....prevUntil() 用来匹配给定DOM对象之后所有同级元素直到遇到Until里定义元素为止 .each() 用来遍历数组及其类似结果 .eq() 用来在元素或者数组中特定索引处获取DOM元素...类似于Jquery中nth:child() 以上就是这篇文章全部内容了,希望本文内容对大家学习或者工作具有一定参考学习价值,如果有疑问大家可以留言交流,谢谢大家支持。

    78421

    selenium css定位

    中,Ctrl+F搜索栏输入css表达式 方法2:在浏览器开发者模式console中,按如下格式验证表达式 $("css表达式") # 注:表达式中存在引号,则使用单引号,'$'可更换为$$ css...属性元素 属性选择器2 属性名='属性值' type="submit" 选择所有type="submit"元素 属性选择器3 属性名~='属性值' type~="submit" 选择所有...选择\中所有\元素 相邻 元素1+元素2 div+p 选择\同级相邻\元素 同级...元素1~元素2 div~p 选择\同级所有\元素 伪属性选择器 伪属性选择器是指元素在html中实际并不存在该属性,是由css定义拓展描述属性...\元素且该元素是其父级唯一一个元素 第一子元素 :first-child p:first-child 选择所有\元素且该元素是其父级第一个元素

    86800

    软件测试|selenium css定位

    中,Ctrl+F搜索栏输入css表达式方法2:在浏览器开发者模式console中,按如下格式验证表达式$("css表达式") # 注:表达式中存在引号,则使用单引号,'$'可更换为$$css选择器语法基础选择器选择器...选择所有class='s_btn'元素属性选择器1属性名 type 选择所有带type属性元素属性选择器2...选择\中所有\元素相邻 元素1+元素2 div+p 选择\同级相邻\元素同级...元素1~元素2 div~p 选择\同级所有\元素伪属性选择器伪属性选择器是指元素在html中实际并不存在该属性,是由css定义拓展描述属性选择器...\元素且该元素是其父级唯一一个元素第一子元素 :first-child p:first-child 选择所有\元素且该元素是其父级第一个元素最后子元素

    72320

    使用 :has() 选择前一个相邻元素

    ) { width: 40px; height: 40px; } 您可以将此选择器视为首先 1) 选择所有框,然后 2) 将元素过滤为仅匹配模式“框 + 圆”元素,这将仅返回圆前一个同级元素...可以将其视为选择所有框 ( .box),然后过滤这些元素,以便剩下元素.box与模式“self + box + Circle”匹配,这将只是前第二个同级元素。...选择所有前面的兄弟姐妹#https://tobiasahlin.com/blog/previous-sibling-css-has/#selecting-all-preceding-siblings 如果要选择所有先前同级元素...,可以将:has()伪类与通用同级组合器 ( ~) 组合,只要第二个元素位于第一个元素之后,无论其位置如何,它都会匹配第二个元素: .box:has(~ .circle) { width: 40px...- except-the-most-adjacent-sibling 最后,我们可以将通用同级组合器 ( ~) 与相邻同级组合器 ( +) 组合起来,并选择除最相邻元素之外所有前面的元素: .box

    34730

    ​工作中后端是如何将API提供出去?swaggo很不错

    工作中后端是如何将API提供出去?...应用案例 要是感兴趣的话,咱们以后可以多多深入探讨和分享,欢迎查看文章 今天咱们来分享一下咱们在工作中,后端小伙伴是如何将 API 高效提供出去呢?...是一个工具,专门用于将 golang 注解自动转换为Swagger 2.0文档 Swagger 又是个啥?...监听指定地址和端口 上述代码编写完毕之后,咱们可以在和main.go 同级目录中初始化一个 go模块,再go build咱们运行程序 go mod init myswa go build 上述命令...docs 目录 再次在main.go同级目录下执行 swag init 生成最新文档 执行 go run main.go , 咱们就可以看到如下效果 此时查看咱们生成docs目录下看看具体文件内容都有个啥

    47120

    Cypress系列(17)- 查找页面元素辅助方法

    li 第一层父亲是 ul,所以只返回它 .siblings() 用来获取 DOM 元素所有同级元素 测试文件代码 ? 测试结果 ?...li 同级元素有其他三个 li 元素 .first() 匹配给定 DOM 元素列表中第一个元素 重点:如果是单个 DOM 元素调用此方法,则返回自己 测试文件代码 ? 测试结果 ?...next家族 .next() 获取给定 DOM 元素后面紧跟下一个同级元素 .nextAll() 获取给定 DOM 元素后面紧跟所有同级元素 .nextUntil(selector) 获取给定...DOM 元素后面紧跟所有同级元素,直到遇到 Until 里定义元素为止 测试文件代码 ?...prev家族 .prev() 获取给定 DOM 元素前面紧跟的上一个同级元素 .prevAll() 获取给定 DOM 元素前面紧跟所有同级元素 .prevUntil() 获取给定 DOM 元素前面紧跟所有同级元素

    2.3K20

    jquery高级选择器第一部分

    ,'orange');//子代选择器,只选择目标元素子代(强制必须子代,子代之后不会被选取) 选取目标元素下一个同级元素(单一兄弟元素选取) // $('.ha + p').css('color'...,'pink');//同级下个元素选择器 选择class为ha下一个p元素 选取目标元素后面的所有同级元素  $('.one~p').css('color','yellow');//同级元素标签选择class...为one后面同级p元素,只能选择目标元素之后 选取指定元素第一个子元素  $('#box p:first').css({'color':'blue','font-size':'50px'});//...选择id是box第一个p元素 选取指定元素最后一个子元素 $('#box p:last').css({'color':'red','font-size':'30px'}); //选取box最后一个...p元素 选取不是某个属性元素 $('#box p:not(.ha)').css('color','green'); //选择#box下所有p标签,排除class是hap标签 选择所有的偶数(even

    40020

    学习zepto.js(对象方法)

    学习zepto.js(对象方法)[6] first: 获取当前对象集合中第一个dom元素。...get: 获取当前对象集合对应下标的某元素,传入参数为一个int下标,如果不传入参数,则将对象转换为一个普通数组并返回; $("div").get(0);     // 第0个。...否则通过当前对象来调用find方法并将selector传入,并调用size方法获取count(filter会自动将返回值转换为bool类型)。 parent: 获取对象集合所有的直接父节点。...,则通过第一个参数调用filter方法并将第二个参数传入filter方法,否则直接返回第一个参数。...$("p").siblings();      // 获取所有p标签同级标签 $("p").siblings(".ad");   // 所有的p标签同级className包含ad元素 通过siblings

    2.6K80

    前端学习笔记之CSS选择器

    p:first-child 同级别的第一个 :last-child p:last-child 同级别的最后一个 :nth-child(n)...同级别的第n个 :nth-last-child(n) 同级别的倒数第n个 #2.2 同级别同类型 :first-of-type 同级别同类型第一个...同级别的唯一一个 #1、同级别的第一个 #1.1 示范一 p:first-child { color: red; } 代表:同级别的第一个,并且第一个要求是一个p标签 我是段落1</p...p都变成红色, #1.2 示范二 p:first-child { color: red; } 代表:同级别的第一个,并且第一个要求是一个p标签 w我是标题 我是段落1...p变红,因为在有在div内同一级别的第一个才是p 注意点: :fist-child就是第一个孩子,不区分类型 #2、同级别的最后一个 p:last-child { color: red

    2K30

    CSS中鼠标滑过图片放大效果

    所有的牌应该保持垂直居中。 听起来不错吧?现在让我们开始带大家一步步写代码。 HTML和flexible元素 让我们先设置一行预览图像。...其中包括: 包含多个.item元素.container父元素容器 每个.item元素都包含一个包装在锚标记中图像 将.container转换为一个flex容器,该容器将行中项对齐 设置.item类...CSS3中鼠标滑过图片突出放大效果 向外移动兄弟元素 让悬停项兄弟项远离悬停项是整个过程中很棘手部分。我们可以使用一个CSS特性是一般兄弟组合器。这使我们可以选择位于悬停项之后所有同级项。...由于通用同级组合器仅适用于位于给定选择器之后同级(没有“向后”),因此我们需要另一种方法。 一种方法是在父容器本身上添加其他悬停规则。这是计划: 悬停父容器时,请将该容器内所有项目向左移动。...如果要在从右到左上下文中使用此效果,则需要将悬停外部容器内所有项目设置为向右移动,并使用常规同级组合器将所有选定项目向左移动。

    8.3K10

    ES Pipeline Aggregation(管道聚合)

    主要有如下两种管道聚合方式: parent sibling 下面一一介绍ES定义管道聚合。 Avg Bucket 聚合 同级管道聚合,它计算同级聚合中指定度量平均值。...同级聚合必须是多桶聚合,针对是度量聚合(metric Aggregation)。...skip:此选项将丢失数据视为bucket不存在。它将跳过桶并使用下一个可用值继续计算。 insert_zeros:默认使用0代。 format 用于格式化聚合桶输出(key)。...from 用与对父聚合桶进行截取,该值之前所有桶将忽略,也就是不参与排序,默认为0。 size 返回桶数。默认为父聚合所有桶。...skip:此选项将丢失数据视为bucket不存在。它将跳过桶并使用下一个可用值继续计算。 insert_zeros:默认使用0代

    4.2K30
    领券