2

首先,我很遗憾地说“删除重复节点并没有按预期的方式工作”,即使我提到了多个线程,这些线程在一定程度上有所帮助,但我仍然没有达到我期望的解决方案。

简而言之,如果我的供应商和 origin_country_id 在以下后代中相同,我想删除 XitemSup 复杂类型元素。

下面是xslt代码

<xsl:stylesheet version="1.0" exclude-result-prefixes="xsl xsd ns3"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ns3="http://xmlns.oracle.com/TSS_to_RMS/RIBXItemProcess/Supplier">
   <xsl:template match="/">
      <ns3:XItemSupDesc>
         <xsl:for-each select="//ns3:XItemSupDesc/ns3:XitemSup">             
            <xsl:if test="not(ns3:supplier=following::ns3:supplier) or not(ns3:origin_country_id=following::ns3:origin_country_id)">
                   <ns3:XitemSup>
                     <ns3:supplier>
                        <xsl:value-of select="./ns3:supplier"/>
                     </ns3:supplier>
                     <ns3:primary_supp_ind>
                        <xsl:value-of select="./ns3:primary_supp_ind"/>
                     </ns3:primary_supp_ind>
                     <ns3:origin_country_id>
                        <xsl:value-of select="./ns3:origin_country_id"/>
                     </ns3:origin_country_id>
                     <ns3:primary_country_ind>
                        <xsl:value-of select="./ns3:primary_country_ind"/>
                     </ns3:primary_country_ind>
                     <ns3:unit_cost>
                        <xsl:value-of select="./ns3:unit_cost"/>
                     </ns3:unit_cost>
                  </ns3:XitemSup>
               </xsl:if>
         </xsl:for-each>
      </ns3:XItemSupDesc>
   </xsl:template>
</xsl:stylesheet>

但是如果我在下面的 xml 上申请它就不起作用

<XItemSupDesc xmlns:ns2="http://xmlns.oracle.com/TSS_to_RMS/RIBXItemProcess/Supplier" xmlns="http://xmlns.oracle.com/TSS_to_RMS/RIBXItemProcess/Supplier">
   <ns2:XitemSup>
      <ns2:supplier>101018</ns2:supplier>
      <ns2:primary_supp_ind>N</ns2:primary_supp_ind>
      <ns2:origin_country_id>CA</ns2:origin_country_id>
      <ns2:primary_country_ind>N</ns2:primary_country_ind>
      <ns2:unit_cost>6</ns2:unit_cost>
   </ns2:XitemSup>
   <ns2:XitemSup>
      <ns2:supplier>102825</ns2:supplier>
      <ns2:primary_supp_ind>N</ns2:primary_supp_ind>
      <ns2:origin_country_id>IN</ns2:origin_country_id>
      <ns2:primary_country_ind>N</ns2:primary_country_ind>
      <ns2:unit_cost>13</ns2:unit_cost>
   </ns2:XitemSup>
   <ns2:XitemSup>
      <ns2:supplier>102825</ns2:supplier>
      <ns2:primary_supp_ind>N</ns2:primary_supp_ind>
      <ns2:origin_country_id>IN</ns2:origin_country_id>
      <ns2:primary_country_ind>N</ns2:primary_country_ind>
      <ns2:unit_cost>24</ns2:unit_cost>
   </ns2:XitemSup>
</XItemSupDesc>

我希望有人可以让我知道 XSLT 代码哪里出错了。

4

1 回答 1

1

我建议不要使用xsl:for-each并且只是覆盖身份转换。

XML 输入

<XItemSupDesc xmlns:ns2="http://xmlns.oracle.com/TSS_to_RMS/RIBXItemProcess/Supplier" xmlns="http://xmlns.oracle.com/TSS_to_RMS/RIBXItemProcess/Supplier">
    <ns2:XitemSup>
        <ns2:supplier>101018</ns2:supplier>
        <ns2:primary_supp_ind>N</ns2:primary_supp_ind>
        <ns2:origin_country_id>CA</ns2:origin_country_id>
        <ns2:primary_country_ind>N</ns2:primary_country_ind>
        <ns2:unit_cost>6</ns2:unit_cost>
    </ns2:XitemSup>
    <ns2:XitemSup>
        <ns2:supplier>102825</ns2:supplier>
        <ns2:primary_supp_ind>N</ns2:primary_supp_ind>
        <ns2:origin_country_id>IN</ns2:origin_country_id>
        <ns2:primary_country_ind>N</ns2:primary_country_ind>
        <ns2:unit_cost>13</ns2:unit_cost>
    </ns2:XitemSup>
    <ns2:XitemSup>
        <ns2:supplier>102825</ns2:supplier>
        <ns2:primary_supp_ind>N</ns2:primary_supp_ind>
        <ns2:origin_country_id>IN</ns2:origin_country_id>
        <ns2:primary_country_ind>N</ns2:primary_country_ind>
        <ns2:unit_cost>24</ns2:unit_cost>
    </ns2:XitemSup>
</XItemSupDesc>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ns2="http://xmlns.oracle.com/TSS_to_RMS/RIBXItemProcess/Supplier">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ns2:XitemSup">
        <xsl:if test="not(following::ns2:XitemSup[ns2:supplier=current()/ns2:supplier and ns2:origin_country_id=current()/ns2:origin_country_id])">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:if>       
    </xsl:template>

</xsl:stylesheet>

XML 输出

<XItemSupDesc xmlns="http://xmlns.oracle.com/TSS_to_RMS/RIBXItemProcess/Supplier" xmlns:ns2="http://xmlns.oracle.com/TSS_to_RMS/RIBXItemProcess/Supplier">
   <ns2:XitemSup>
      <ns2:supplier>101018</ns2:supplier>
      <ns2:primary_supp_ind>N</ns2:primary_supp_ind>
      <ns2:origin_country_id>CA</ns2:origin_country_id>
      <ns2:primary_country_ind>N</ns2:primary_country_ind>
      <ns2:unit_cost>6</ns2:unit_cost>
   </ns2:XitemSup>
   <ns2:XitemSup>
      <ns2:supplier>102825</ns2:supplier>
      <ns2:primary_supp_ind>N</ns2:primary_supp_ind>
      <ns2:origin_country_id>IN</ns2:origin_country_id>
      <ns2:primary_country_ind>N</ns2:primary_country_ind>
      <ns2:unit_cost>24</ns2:unit_cost>
   </ns2:XitemSup>
</XItemSupDesc>

注意:如果您可以使用 XSLT 2.0,您可以去掉xsl:if模板并将模板更改为:

<xsl:template match="ns2:XitemSup[following::ns2:XitemSup[ns2:supplier=current()/ns2:supplier and ns2:origin_country_id=current()/ns2:origin_country_id]]"/>
于 2012-10-20T04:47:57.043 回答