我有XML,我想选择连续出现的相同节点。
<main>
<topic1>
<ntb>1</ntb>
<ifs>2</ifs>
<jst>3</jst>
<ifs>4</ifs>
</topic1>
<topic2>
<ifs>1</ifs>
<ntb>2</ntb>
<jst>3</jst>
<ifs>4</ifs>
<ifs>5</ifs>
</topic2>
</main>
我尝试了以下代码:
<xsl:template match="topic2/ifs">
<count_node>
<xsl:apply-templates/>
</count_node>
</xsl:template>
当我尝试上述代码时,所有<ifs>
标签都被选中。
我想使用XPath在<ifs>
标记内选择最后两个<topic2>
标记,因为它们是连续的
预期输出:
<count_node>
<ifs>4</ifs>
<ifs>5</ifs>
</count_node>
答案 0 :(得分:0)
这里是连续获取具有相同名称的第二个节点的xpath。
//*[local-name()=name(following-sibling::*)]/following-sibling::*
您可以使用名称或本地名称。
//*[name()=name(following::*)]/following-sibling::*
编辑:
这里是选择所有具有相同标签名称的连续元素的xpath(即使您有两个以上具有相同标签的连续元素也可以使用)
//*[name()=name(following-sibling::*[1])]|//*[name()=name(preceding-sibling::*[1])]
仅供参考:我尚未对标签名称进行硬编码,因此它会选择任何连续的标签,如果您要查找特定标签,请使用标签名称更新*
。
编辑:OP使用的xpath。
//ifs[following-sibling::*[1][self::ifs] or preceding-sibling::*[1][self::ifs]]
答案 1 :(得分:0)
尝试一下:
.product-cat:nth-child(odd) .product-cat-image{
-webkit-order: 1;
order: 1;
}
.product-cat:nth-child(odd) .product-cat-details{
-webkit-order: 2;
order: 2;
}
.product-cat:nth-child(even) .product-cat-image{
-webkit-order: 2;
order: 2;
}
.product-cat:nth-child(even) .product-cat-details{
-webkit-order: 1;
order: 1;
}
在此处查看演示:https://xsltfiddle.liberty-development.net/gWvjQfD/1
注意:以上解决方案将填充<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<count_node>
<xsl:apply-templates />
</count_node>
</xsl:template>
<xsl:template match="topic2/ifs[preceding-sibling::node()[1][self::ifs] or following-sibling::node()[1][self::ifs]]">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
中所有连续的<ifs>
节点
答案 2 :(得分:0)
假设您可以使用XSLT 2或更高版本,则可以为topic2
元素编写一个模板,该模板查找并包装至少两个ifs
个子元素的组,
<xsl:template match="topic2">
<xsl:for-each-group select="*" group-adjacent="boolean(self::ifs)">
<xsl:if test="current-grouping-key() and current-group()[2]">
<count_node>
<xsl:copy-of select="current-group()"/>
</count_node>
</xsl:if>
</xsl:for-each-group>
</xsl:template>
https://xsltfiddle.liberty-development.net/jyRYYiF处的完整示例使用Saxon 9.8,XSLT 3也是如此,但是上面的模板仅使用XSLT 2中已经可用的功能。