我是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问题让我很接近,但只是没有....
答案 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
。您可以轻松找到这两种技术的示例。