使用XPath轴在XSLT之前的祖先中找到相同的节点

时间:2015-05-07 21:16:25

标签: xml xslt xpath

我是XSLT中XPath表达式的新手,并且已经在桌面上撞了很长时间。我想评估当前节点的前一个祖先中的兄弟节点,并测试该节点是否相同。

这是我的XML:

<item>
    <number>1.0</number>
    <category>Data</category>
    <functionality>Search Screen</functionality>
    <requirement_type>SIT</requirement_type>
    <table>Table</table>
</item>
<item>
    <number>1.1</number>
    <category>Data</category>
    <functionality>Search Screen</functionality>
    <requirement_type>SIT</requirement_type>
</item>

这是我的XSLT:

<xsl:for-each select="item">
  <xsl:if test="not(preceding-sibling::*[position()=1])">
    <xsl:value-of select="category"/>
  </xsl:if>
</xsl:for-each>

本质上,我正在尝试测试第二个<category>节点的<item>子节点是否与第一个<category>子节点相同<item>子节点} node。

搜索类似的StackOverflow问题让我很接近,但只是没有....

1 个答案:

答案 0 :(得分:1)

假设格式良好的输入文档具有单个最外层元素。另外,正如您所看到的,我在id元素中添加了item属性,以便能够区分它们。

XML输入

<root>
    <item id="1">
        <number>1.0</number>
        <category>Data</category>
        <functionality>Search Screen</functionality>
        <requirement_type>SIT</requirement_type>
        <table>Table</table>
    </item>
    <item id="2">
        <number>1.1</number>
        <category>Data</category>
        <functionality>Search Screen</functionality>
        <requirement_type>SIT</requirement_type>
    </item>
</root>

要确定前一个兄弟category元素的item子元素是否相同,您可以使用

<xsl:if test="category = preceding-sibling::item[1]/category">

如果语义实际上应该是不同的,你真的需要更清楚地解释这个,也许还要修改示例文档。

XSLT样式表

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <xsl:template match="/root">
      <result>
            <xsl:for-each select="item">
              <xsl:if test="category = preceding-sibling::item[1]/category">
                <xsl:value-of select="@id"/>
              </xsl:if>
            </xsl:for-each>
      </result>
    </xsl:template>

</xsl:transform>

XML输出

<?xml version="1.0" encoding="UTF-8"?>
<result>2</result>

在线尝试此转化here

修改

  

是的,我尝试按类别对项目进行分组。基本上,我想在一个类别中获得一组不同的项目。

为了完整性,正如Michael所指出的那样,您正在尝试解决分组问题。在XSLT 1.0中,使用并执行Muenchian分组。在XLST 2.0中,使用xsl:for-each-group。您可以轻松找到这两种技术的示例。