xml - 使用 XSLT 删除节点中的重复值
问题描述
我有以下 XML:
<?xml version="1.0" encoding="utf-8" ?>
<SLOCDETAILS>
<INPUT>
</INPUT>
<TABLES>
<OUTPUT>
<item>
<PLANT>INDIA</PLANT>
<SLOC>T150</SLOC>
<MATNR>220250</MATNR>
<CHARG>112233</CHARG>
</item>
<item>
<PLANT>INDIA</PLANT>
<SLOC>T152</SLOC>
<MATNR>220250</MATNR>
<CHARG>223344</CHARG>
</item>
<item>
<PLANT>INDIA</PLANT>
<SLOC>T152</SLOC>
<MATNR>220250</MATNR>
<CHARG>445566</CHARG>
</item>
<item>
<PLANT>INDIA</PLANT>
<SLOC>T152</SLOC>
<MATNR>220250</MATNR>
<CHARG>667788</CHARG>
</item>
<item>
<PLANT>INDIA</PLANT>
<SLOC>T152</SLOC>
<MATNR>220250</MATNR>
<CHARG>998877</CHARG>
</item>
</OUTPUT>
</TABLES>
</SLOCDETAILS>
我的 XSLT 如下:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan" version="1.0">
<xsl:template match="/">
<Rowsets>
<Rowset Name="List">
<xsl:for-each select="SLOCDETAILS/TABLES/OUTPUT/item">
<Row>
<PLANT>
<xsl:value-of select="PLANT"/>
</PLANT>
<SLOC>
<xsl:value-of select="SLOC"/>
</SLOC>
<Material>
<xsl:value-of select="MATNR"/>
</Material>
<Batch>
<xsl:value-of select="CHARG"/>
</Batch>
</Row>
</xsl:for-each>
</Rowset>
</Rowsets>
</xsl:template>
</xsl:stylesheet>
我生成的 XML 是:
<?xml version="1.0" encoding="utf-8"?>
<Rowsets>
<Rowset Name="List">
<Row>
<PLANT>INDIA</PLANT>
<SLOC>T150</SLOC>
<Material>220250</Material>
<Batch>112233</Batch>
</Row>
<Row>
<PLANT>INDIA</PLANT>
<SLOC>T152</SLOC>
<Material>220250</Material>
<Batch>223344</Batch>
</Row>
<Row>
<PLANT>INDIA</PLANT>
<SLOC>T152</SLOC>
<Material>220250</Material>
<Batch>445566</Batch>
</Row>
<Row>
<PLANT>INDIA</PLANT>
<SLOC>T152</SLOC>
<Material>220250</Material>
<Batch>667788</Batch>
</Row>
<Row>
<PLANT>INDIA</PLANT>
<SLOC>T152</SLOC>
<Material>220250</Material>
<Batch>998877</Batch>
</Row>
</Rowset>
</Rowsets>
现在我只想要独一无二的 SLOC。所以对于这个 XML,应该填充的 SLOC 应该是<SLOC>T150</SLOC>
&<SLOC>T152</SLOC>
<SLOC>T152</SLOC>
正在重复 4 次。我想避免这种情况。
如何使用 XSLT 实现这一点?
我确信有一种可以使用的分组方法。XSLT 是否还提供了我们可以即插即用的独特价值类型的功能?解决此问题的不同方法将非常有帮助。
谢谢 !
解决方案
试试这个:
<xsl:template match="/">
<Rowsets>
<Rowset Name="List">
<xsl:for-each select="SLOCDETAILS/TABLES/OUTPUT/item[not(SLOC = preceding-sibling::item/SLOC)]">
<Row>
<PLANT>
<xsl:value-of select="PLANT"/>
</PLANT>
<SLOC>
<xsl:value-of select="SLOC"/>
</SLOC>
<Material>
<xsl:value-of select="MATNR"/>
</Material>
<Batch>
<xsl:value-of select="CHARG"/>
</Batch>
</Row>
</xsl:for-each>
</Rowset>
</Rowsets>
</xsl:template>
推荐阅读
- python - 如何在不使用“元”的情况下在 Scrapy Parse 方法之间同步数据?
- ios - 如何使用导航按钮在 swift 5 中显示插页式广告
- bash - Windows 10,符号链接:行为差异,bash 与 cmd shell
- ios - iOS:子类化具有相同插座/布局但没有第二个 xib 的子类 UICollectionViewCell?
- javascript - 在特定频道 Discord.js 中发送错误
- liferay - 如何为 Liferay DXP JSON 远程服务实现 Token auth?
- r - Plotly 不绘制非二次曲面
- javascript - 并行 div 滚动
- python - 是否有可能获得一个使用 tkinter 在使用烧瓶的网页中运行的 python 程序?
- google-bigquery - 维护/设置写入截断计划查询的列描述