xml - 通过保留节点的第一次出现来删除 XSLT 属性中的重复项
问题描述
我正在尝试获取 XML 的唯一值并删除重复项。我想第一次出现属性 id 相同的标签。还要注意其他不重复的射频标签不会被删除。
我的 XML 是-
<rfs>
<rf id="key_1_fam_1">
<data>
<entry>
<key>a</key>
<value>2</value>
</entry>
</data>
<cc>ccid1</cc>
<name>as</name>
<ref>21</ref>
<recs>
<rec id="key_1_fam_1_rec1">
<data>
<entry>
<key>a</key>
<value>2</value>
</entry>
</data>
<type>VALID</type>
</rec>
</recs>
<colour>false</colour>
</rf>
<rf id="key_1_fam_1">
<data>
<entry>
<key>a</key>
<value>2</value>
</entry>
</data>
<cc>ccid1</cc>
<name>as</name>
<ref>21</ref>
<recs>
<rec id="key_1_fam_1_rec1">
<data>
<entry>
<key>a</key>
<value>2</value>
</entry>
</data>
<type>VALID</type>
</rec>
</recs>
<colour>false</colour>
</rf>
<rf id="fam_2">
<data>
<entry>
<key>cb</key>
<value>2</value>
</entry>
</data>
<costCentre>ccd2</costCentre>
<name>V</name>
<reference>31</reference>
<recs>
<rec id="fam_2_rec2">
<data>
<entry>
<key>cs</key>
<value>aa</value>
</entry>
</data>
</rec>
</recs>
<colour>false</colour>
</rf>
<rf id="fam_3">
<data>
<entry>
<key>csb</key>
<value>2</value>
</entry>
</data>
<costCentre>ccd2</costCentre>
<name>V</name>
<reference>34</reference>
<recs>
<rec id="fam_3_rec12">
<data>
<entry>
<key>crs</key>
<value>aa</value>
</entry>
</data>
</rec>
</recs>
<colour>false</colour>
</rf>
</rfs>
我希望输出像 -
<?xml version="1.0" encoding="UTF-8"?><rfs>
<rf id="key_1_fam_1">
<data>
<entry>
<key>a</key>
<value>2</value>
</entry>
</data>
<cc>ccid1</cc>
<name>as</name>
<ref>21</ref>
<recs>
<rec id="key_1_fam_1_rec1">
<data>
<entry>
<key>a</key>
<value>2</value>
</entry>
</data>
<type>VALID</type>
</rec>
</recs>
<colour>false</colour>
</rf>
<rf id="fam_2">
<data>
<entry>
<key>cb</key>
<value>2</value>
</entry>
</data>
<costCentre>ccd2</costCentre>
<name>V</name>
<reference>31</reference>
<recs>
<rec id="fam_2_rec2">
<data>
<entry>
<key>cs</key>
<value>aa</value>
</entry>
</data>
</rec>
</recs>
<colour>false</colour>
</rf>
<rf id="fam_3">
<data>
<entry>
<key>csb</key>
<value>2</value>
</entry>
</data>
<costCentre>ccd2</costCentre>
<name>V</name>
<reference>34</reference>
<recs>
<rec id="fam_3_rec12">
<data>
<entry>
<key>crs</key>
<value>aa</value>
</entry>
</data>
</rec>
</recs>
<colour>false</colour>
</rf>
</rfs>
我尝试了以下 XSLT 并尝试了不同的值,但不确定我缺少什么。
<?xml version="1.0" ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:clariant="http://www.tridan.it/c"
version="2.0">
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template name="removeDups">
<xsl:if test="not(. = preceding::node())">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="rfs">
<xsl:call-template name="removeDups">
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>
任何帮助都会非常感激,因为我是 XSLT 的新手。
解决方案
你的样式表说version="2.0"
。在 XSLT 2.0 或更高版本中,您最好的选择是使用分组:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/rfs">
<xsl:copy>
<xsl:for-each-group select="rf" group-by="@id">
<!-- copy the first item of current group -->
<xsl:copy-of select="."/>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- javascript - 除非我在调试,否则 ChartJS 不会读取数据
- java - 如何更改 JFoenix 拾色器库的 CSS 样式?
- php - 无法反序列化字符串
- reactjs - 如何在类之间共享 Car 接口并将类型检查添加到 CarItem 类?
- r - 如何在ggplot2中将difftime格式化为hh:mm?
- r - 滚动逻辑模型函数
- python - 重试方法发生异常,未分类为瞬态
- python - 如何使用 Python 3 和 Beautiful Soup 获取 Wikipedia 文章的文本?
- css - CSS3 - 网格模板区域未正确跨越
- c++ - 是否可以在计算中对串行依赖项使用 SIMD,例如指数移动平均滤波器?