选择连续存在的相同节点

时间:2019-05-07 03:36:40

标签: xslt xpath

我有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>

3 个答案:

答案 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中已经可用的功能。