很抱歉,如果这是重复的,但我正在努力解决。我有一个xml变量。我有xsl变量,它具有如下所示的xml:
<root>
<data>
<GroupItems>
<row id="30" class="A100"/>
<row id="50" class="B100"/>
<row id="100" class="A100"/>
<row id="20" class="C100"/>
</GroupItems>
</data>
</root>
我必须基于“类”值替换先前的同级节点中的“ id”值。必须删除重复的先前的class =“ A100”,但必须将“ id”值复制到第一个出现的节点。在这种情况下,所需的输出是:
<root>
<data>
<GroupItems>
<row id="100" class="A100"/>
<row id="50" class="B100"/>
<row id="20" class="C100"/>
</GroupItems>
</data>
</root>
下面的代码从字符串中删除重复项,但我需要替换id值(id =“ 100”)。
<xsl:for-each select="CSharp:NodeList($RawInstruction1)//GroupItems/row[(@class = preceding-sibling::row/@class)]">
答案 0 :(得分:0)
从身份转换模板开始,然后添加一个密钥以按row
属性对class
元素进行“分组”,然后添加模板以从最后一个复制id
属性将每个组中的row
复制到第一个模板和另一个模板中,以禁止将其余重复的row
复制到一个组中:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:key name="class-group" match="GroupItems/row" use="@class"/>
<xsl:template match="GroupItems/row[generate-id() = generate-id(key('class-group', @class)[1])]/@id">
<xsl:copy-of select="key('class-group', ../@class)[last()]/@id"/>
</xsl:template>
<xsl:template match="GroupItems/row[not(generate-id() = generate-id(key('class-group', @class)[1]))]"/>
</xsl:stylesheet>