XSLT:复制当前节点子元素并跳过前两个元素的代码问题咨询
解决XSLT复制当前节点子元素并跳过前两个的问题
我来帮你搞定这个XSLT的小问题~你的核心需求是复制当前节点的子元素,但排除前两个,之前的写法出错主要是路径选择和上下文的问题,咱们一步步理清楚:
问题出在哪?
先拆解你之前尝试的错误写法:
node()/.[position()>2]:这里的node()已经是当前节点的子节点集合了,后面加/.相当于去取每个子节点的自身,此时position()的上下文是每个子节点的内部,不是当前节点子节点的全局位置,所以过滤逻辑完全不对。node()/.[name!='name' and name!='surname']:同样路径错误,而且判断元素名应该用name()函数(不是name),另外硬编码元素名不如用位置过滤通用。node()/*:这个是取当前节点子节点的子元素(也就是孙元素),自然不是你要的当前节点直接子元素。
正确的写法
根据你是否需要包含非元素节点(比如文本、注释、处理指令),分两种情况:
情况1:只复制子元素节点(排除文本、注释等)
直接选择当前节点下的元素,过滤位置大于2的:
<xsl:element name="rest"> <xsl:copy-of select="*[position() > 2]"/> </xsl:element>
情况2:复制所有类型的子节点(包括文本、注释等)
如果需要保留所有类型的子节点,把*换成node()即可:
<xsl:element name="rest"> <xsl:copy-of select="node()[position() > 2]"/> </xsl:element>
示例验证
假设你的源XML是这样的:
<parent> <name>Alice</name> <surname>Smith</surname> <age>30</age> <city>New York</city> <!-- 这是一条注释 --> 一些文本内容 </parent>
用第一种写法(只取元素)会生成:
<rest> <age>30</age> <city>New York</city> </rest>
用第二种写法(保留所有子节点)会生成:
<rest> <age>30</age> <city>New York</city> <!-- 这是一条注释 --> 一些文本内容 </rest>
内容的提问来源于stack exchange,提问作者roditu
相关产品推荐
相关产品推荐

