【发布时间】:2021-04-08 18:03:28
【问题描述】:
考虑到标签/值,我想删除重复记录。
这是输入:
<Details>
<block order="1" title="Circle A" id="Circle">
<block id="square" title="Square 1" order="1">
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street xpto</field>
<field order="3" title="C" id="ID c">Sun</field>
<field order="4" title="D" id="ID d">45-34-YT</field>
<field order="5" title="E" id="ID e">500</field>
<field order="6" title="F" id="ID f">ABC</field>
<field order="7" title="G" id="ID g">Street xpto</field>
<field order="8" title="H" id="ID h">39RT</field>
<field order="9" title="I" id="ID i">Working Closet</field>
</block>
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street xpto</field>
<field order="3" title="C" id="ID c">Sun</field>
<field order="4" title="D" id="ID d">45-34-YT</field>
<field order="5" title="E" id="ID e">500</field>
<field order="6" title="F" id="ID f">ABC</field>
<field order="7" title="G" id="ID g">Street xpto</field>
<field order="8" title="H" id="ID h">39RT</field>
<field order="9" title="I" id="ID i">Working Closet</field>
</block>
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street xpto</field>
<field order="3" title="C" id="ID c">Sun</field>
<field order="4" title="D" id="ID d">45-34-YT</field>
<field order="5" title="E" id="ID e">500</field>
<field order="6" title="F" id="ID f">ABC</field>
<field order="7" title="G" id="ID g">Street xpto</field>
<field order="8" title="H" id="ID h">39RT</field>
<field order="9" title="I" id="ID i">Working Closet</field>
</block>
</block>
</block>
</Details>
这是愿望输出:
<Details>
<block order="1" title="Circle A" id="Circle">
<block id="square" title="Square 1" order="1">
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street xpto</field>
<field order="3" title="C" id="ID c">Sun</field>
<field order="4" title="D" id="ID d">45-34-YT</field>
<field order="5" title="E" id="ID e">500</field>
<field order="6" title="F" id="ID f">ABC</field>
<field order="7" title="G" id="ID g">Street xpto</field>
<field order="8" title="H" id="ID h">39RT</field>
<field order="9" title="I" id="ID i">Working Closet</field>
</block>
</block>
</block>
</Details>
我已经尝试过使用这个 xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:if test="not(preceding-sibling::node()[.=string(current())])">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
但正在删除我需要保留的这些行:
<field order="5" title="E" id="ID e">500</field>
<field order="7" title="G" id="ID g">Street xpto</field>
因为我的 xslt 只考虑标签值。 我不知道如何考虑所有行,而不仅仅是值。 有人可以帮忙吗?
谢谢。 何塞
更精确的样本。 示例 1: 输入:
<Details>
<block order="1" title="Circle A" id="Circle">
<block id="square" title="Square 1" order="1">
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street xpto</field>
<field order="3" title="C" id="ID c">500</field>
</block>
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street xpto</field>
<field order="3" title="C" id="ID c">500</field>
</block>
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street xpto</field>
<field order="3" title="C" id="ID c">500</field>
</block>
</block>
</block>
</Details>
输出:
<Details>
<block order="1" title="Circle A" id="Circle">
<block id="square" title="Square 1" order="1">
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street xpto</field>
<field order="3" title="C" id="ID c">500</field>
</block>
</block>
</block>
</Details>
结果:一个不同的块 id“点”
示例 2: 第 3 个街区不同,因为第 2 场现在是“A 街” 输入:
<Details>
<block order="1" title="Circle A" id="Circle">
<block id="square" title="Square 1" order="1">
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street xpto</field>
<field order="3" title="C" id="ID c">500</field>
</block>
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street xpto</field>
<field order="3" title="C" id="ID c">500</field>
</block>
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street A</field>
<field order="3" title="C" id="ID c">500</field>
</block>
</block>
</block>
</Details>
输出:
<Details>
<block order="1" title="Circle A" id="Circle">
<block id="square" title="Square 1" order="1">
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street xpto</field>
<field order="3" title="C" id="ID c">Sun</field>
</block>
<block id="dot" title="test" order="1">
<field order="1" title="A" id="ID a">500</field>
<field order="2" title="B" id="ID b">Street A</field>
<field order="3" title="C" id="ID c">Sun</field>
</block>
</block>
</block>
</Details>
结果:两个不同的块 id "dot"
我希望这些新样本有助于澄清我所假装的内容。 提前感谢您的所有回复和回答。
【问题讨论】:
-
块之间的字段是否可能以任何方式有所不同?如果是这样,你能举个例子吗?
-
如果您仅限于 XSLT 1.0,则使用 Muenchian grouping 而不是您现在使用的低效方法。这也将允许您使用 key 来连接您要考虑的所有值(您的问题不清楚哪些值)。
-
@SiebeJongebloed,字段没有区别
-
@michael.hor257k,我希望始终拥有独特的
<block id="dot"内容。在这种情况下,我有 3 个相同的块,输出应该是不同的,仅显示 1 个块。如果其中一个块中的某个值与其他块不同,则该块应出现在输出中。总之,我想使用“不同”功能来输出独特的块。我希望我说清楚了。 -
@JoseMartins,哪个 XSLT 处理器,您使用或可以使用哪个版本?
unique contents到底是什么意思? XPath 2 和更高版本的函数deep-equalw3.org/TR/xpath-functions/#func-deep-equal 会表达这种要求吗?
标签: xslt duplicates