删除特定元素值及其副本,并用xslt代码中的一个xml值替换它

时间:2015-06-08 13:41:40

标签: xml xslt xslt-1.0

下面是我的示例XML文件,如果其值为“H”则删除特定节点的重复项,然后它将删除Test5中的所有重复项,其值为H else其他值test5可以具有值,无需删除任何重复项.Any Help非常感谢:以下是场景:

场景1:对于Test3值,如果超过1 H可用,则在Test5中仅保留一个H值,然后删除其他H并保留一个,不要删除Test3的其他Test5值和重复值,即E,T,M等

<Report_Data>
<Report_Entry>
 <Test1>ABC</Test1>
 <Test2>ABC</Test2>
  <Test3>000</Test3>
   <Test4>ABC</Test4>
   <Test5>H</Test5>
   <Test6>Match</Test6>

    </Report_Entry>
        <Report_Entry>
         <Test1>ABC</Test1>
           <Test2>ABC</Test2>
         <Test3>000</Test3>
         <Test4>ABC</Test4>
           <Test5>E</Test5>
          <Test6>Match</Test6>

            </Report_Entry>
            <Report_Entry>
         <Test1>ABC</Test1>
        <Test2>ABC</Test2>
        <Test3>000</Test3>
         <Test4>ABC</Test4>
         <Test5>H</Test5>
         <Test6>Match</Test6>
        </Report_Entry>

         <Report_Entry>
        <Test1>ABC</Test1>
           <Test2>ABC</Test2>
           <Test3>000</Test3>
           <Test4>ABC</Test4>
             <Test5>H</Test5>
               <Test6>Match</Test6>
                 </Report_Entry>
                   </Report_Data>

预期产出:

               <Report_Data>
           <Report_Entry>
           <Test1>ABC</Test1>
           <Test2>ABC</Test2>
          <Test3>000</Test3>
           <Test4>ABC</Test4>
           <Test5>H</Test5>
          <Test6>Match</Test6>
             </Report_Entry>
                  <Report_Entry>
                     <Test1>ABC</Test1>
             <Test2>ABC</Test2>
            <Test3>000</Test3>
            <Test4>ABC</est4>
               <Test5>E</Test5>
             <Test6>Match</Test6>
           </Report_Entry>
              </Report_Data>

使用XSLT进行分组和删除重复项:

           <?xml version="1.0" encoding="UTF-8" ?>
            <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                            version="1.0">
               <xsl:output method="xml" encoding="UTF-8" indent="yes" />

                <xsl:strip-space elements="*"/>

             <xsl:key name="Test5-H" match="Test5" use="."/>


                <xsl:template match="Report_Data">
             <catalog>
                 <xsl:apply-templates/>
                   </catalog>
                 </xsl:template>

             <xsl:template match="Report_Entry">
                  <xsl:copy>
        <xsl:copy-of select="@*"/>
        <Test5>
            <xsl:for-each select="Test5[count(. | key('Test5-H', .)[1]) = 1]">
                <xsl:value-of select="."/>
                <xsl:if test="position() != last()">
                    <xsl:text>,</xsl:text>
                </xsl:if>
              </xsl:for-each>
               </Test5>

                 </xsl:copy>
             </xsl:template>

               </xsl:transform>

以上代码的问题是它删除了test5的所有重复项,但我只需要删除如果test5的值为H.

1 个答案:

答案 0 :(得分:0)

您说要删除特定元素,但与Report_Entry匹配的当前模板始于复制Report_Entry

<xsl:template match="Report_Entry">
    <xsl:copy>

您可能需要做的是添加xsl:if,使用您现有的表达式进行分组,此处

<xsl:template match="Report_Entry">
  <xsl:if test="Test5[count(. | key('Test5-H', .)[1]) = 1]">
    <xsl:copy-of select=".">
   </xsl:if>
</xsl:template>

但是,将密钥更改为此可能稍微合乎逻辑,因为您实际上是按Report_Entry元素对Test5元素进行分组

 <xsl:key name="Test5-H" match="Report_Entry" use="Test5"/>

然后,当你删除元素时,你有一个这样的模板

 <xsl:template match="Report_Entry[not(count(. | key('Test5-H', Test5)[1]) = 1)]" />

这需要与身份模板结合使用。

试试这个XSLT

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="Test5-H" match="Report_Entry" use="Test5"/>

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

    <xsl:template match="Report_Entry[not(count(. | key('Test5-H', Test5)[1]) = 1)]" />
</xsl:transform>