【问题标题】:How to remove Duplicate nodes in xml using xslt 1.0如何使用 xslt 1.0 删除 xml 中的重复节点
【发布时间】:2014-12-03 05:23:24
【问题描述】:

嗨,

请帮助我从 xml 中删除重复节点。删除重复节点的条件非常复杂。

条件 1:在 policyKey 节点下的每个策略节点中,我必须检查 policyNbr 和 PolicyFormCode/code 以及 policyEffectiveDt 和 policyID 如果所有策略节点相同,则它们在所有策略节点中都相同我只保留其中存在 sourceSystemCd/code='SCBP' 的策略节点。

条件 2:如果在上述条件下 policyNbr 和 PolicyFormCode/code 以及 policyEffectiveDt 和 policyID 中的任何一个具有不同的值,我需要显示所有策略节点。

输入xml: 条件一:

<?xml version="1.0" encoding="utf-8"?>
<policies>
    <!-- policy 1-->
    <policy>
        <policyKey>
            <policyNbr>4567</policyNbr>
            <policyEffectiveDt>2014-11-14</policyEffectiveDt>
            <policyFormCd>
                <code>669</code>
            </policyFormCd>
        </policyKey>
        <transactionSplitTrans>
            <sourceSystemCd>
                <code>ARA</code>
            </sourceSystemCd>
        </transactionSplitTrans>
    </policy> 
    <!-- second -->
    <policy>
        <policyKey>
            <policyNbr>1234</policyNbr>
            <policyID>115774001</policyID>
            <policyEffectiveDt>2014-11-11</policyEffectiveDt>
            <policyFormCd>
                <code>660</code>
            </policyFormCd>
        </policyKey>
        <transactionSplitTrans>
            <sourceSystemCd>
                <code>ARAR</code>
            </sourceSystemCd>
        </transactionSplitTrans>
    </policy>
    <!-- third -->
    <policy>
        <policyKey>
            <policyEffectiveDt>2014-11-14</policyEffectiveDt>
            <policyFormCd>
                <code>660</code>
            </policyFormCd>
            <policyID>115774001</policyID>
            <policyNbr>1234</policyNbr>
        </policyKey>
        <transactionSplitTrans>
            <sourceSystemCd>
                <code>SCBP</code>
            </sourceSystemCd>
        </transactionSplitTrans>
    </policy>
</policies>

扩展输出:

    <policies>
    <!-- policy 1-->
<policy>
    <policyKey>
        <policyNbr>4567</policyNbr>
        <policyEffectiveDt>2014-11-14</policyEffectiveDt>
        <policyFormCd>
            <code>669</code>
        </policyFormCd>
    </policyKey>
    <transactionSplitTrans>
        <sourceSystemCd>
            <code>ARA</code>
        </sourceSystemCd>
    </transactionSplitTrans>
</policy>
<!-- third -->
<policy>
    <policyKey>
        <policyEffectiveDt>2014-11-14</policyEffectiveDt>
        <policyFormCd>
            <code>660</code>
        </policyFormCd>
        <policyID>115774001</policyID>
        <policyNbr>1234</policyNbr>
    </policyKey>
    <transactionSplitTrans>
        <sourceSystemCd>
            <code>SCBP</code>
        </sourceSystemCd>
    </transactionSplitTrans>
</policy>
</policies>

条件2:显示全部三个policyNode

【问题讨论】:

  • 那么如果没有重复项,您想保留一个没有策略 ID 的吗?
  • 你熟悉Muenchian grouping吗?

标签: xslt-1.0


【解决方案1】:
<xsl:template match="/policies/policy">
<xsl:choose>
    <xsl:when test="./policyKey/policyID">
        <xsl:copy-of select='.'/>
    </xsl:when>
    <xsl:otherwise>
        <xsl:variable name='currNumber' select="number(policyKey/policyNbr)"/>
        <xsl:variable name="currCode" select="policyKey/policyFormCd/code"/>
        <xsl:if test="count(../policy/policyKey[number(policyNbr)=$currNumber and policyFormCd/code=$currCode and policyID]) = 0">
            <xsl:copy-of select='.'/>
        </xsl:if>
    </xsl:otherwise>
</xsl:choose>
</xsl:template>

这应该可行。如果策略有 ID,则复制它。如果没有并且没有匹配的具有 id 的,那么也复制它。 (可能更短,但这应该足够清楚)。经过测试。

【讨论】:

  • 添加了对策略代码的检查。数字与 number(policyNbr) 进行比较以处理不同的格式。
  • 在上面代码中我们有“number(something)”的所有地方,替换为:“substring (concat ('0000000000000000', something), string-length(something)+1, 16)” .这用前导零填充它到 16 个字节,然后取最右边的 16 个字符。如果某些十六进制值是大写和小写(例如 7E707 和 7e707),那么您必须将其包装在一个 transform () 语句中。糟糕,但那是给你的 XSL。
【解决方案2】:

请在上面的xslt中替换下面的部分并尝试...

<xsl:variable name='currNumber' select="translate(policyKey/policyNbr,'0*','')"/>


<xsl:if test="count(../policy/policyKey[translate(policyNbr,'0*','')=$currNumber and policyFormCd/code=$currCode and policyID]) = 0">

【讨论】:

  • xslt 没有正则表达式,因此您不能指定 leading 零。上面的翻译会用空值替换所有的零。
猜你喜欢
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多