需要仅针对选择性案例打印数据

时间:2015-06-20 15:59:20

标签: xml xslt-1.0

<PEE>
 <PG>
   <EMP>

          <Summary>
              <EMP_ID>1</EMP_ID>
          </Summary>

          <PE>
             <Operation>NONE</Operation>
             <AN>100</AN>
         </PE>

          <PE>
             <Operation>REMOVE</Operation>
             <AN>200</AN>
         </PE>

         <PE>
             <Operation>ADD</Operation>
             <AN>300</AN>
         </PE>
  </EMP>

  <EMP>

          <Summary>
              <EMP_ID>2</EMP_ID>
          </Summary>

          <PE>
             <Operation>REMOVE</Operation>
             <AN>400</AN>
         </PE>

          <PE>
             <Operation>NONE</Operation>
             <AN>500</AN>
         </PE>

         <PE>
             <Operation>NONE</Operation>
             <AN>600</AN>
         </PE>

     </EMP>
 </PG>
</PEE>

你好@Michael,非常感谢你以前的回答。我在这里给你一个更合适的xml,它是实际xml的一部分。您的理解是正确的,不应在输出中打印“REMOVE”操作,并且只有在相同的“EMP_ID”中至少有一个“ADD”/“MODIFY”子操作时才会打印“NONE”操作。我希望文本输出中有2行,其中第一行应为'1 NONE 100',第二行应为'1 ADD 300'。 请求你帮我解决这个问题。谢谢!

1 个答案:

答案 0 :(得分:1)

预期输出的格式不太清楚。以下样式表将按原样复制所有内容,但不包括:

  1. account为“REMOVE”的任何action;
  2. account为“无”的任何action且没有其account为“已添加”或“修改”的兄弟action
  3. XSLT 1.0

    <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:strip-space elements="*"/>
    
    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="account[action='REMOVE' or action='NONE' and not(../account[action='ADD' or action='MODIFY'])]"/>
    
    </xsl:stylesheet>
    

    测试输入

    <root>
      <emp>
        <summary>
          <emp_id>1</emp_id>
        </summary>
        <account>
          <action>REMOVE</action>
          <value>11</value>
        </account>
        <account>
          <action>NONE</action>
          <value>12</value>
        </account>
      </emp>
      <emp>
        <summary>
          <emp_id>2</emp_id>
        </summary>
        <account>
          <action>REMOVE</action>
          <value>21</value>
        </account>
        <account>
          <action>NONE</action>
          <value>23</value>
        </account>
        <account>
          <action>ADD</action>
          <value>22</value>
        </account>
      </emp>
      <emp>
        <summary>
          <emp_id>3</emp_id>
        </summary>
        <account>
          <action>REMOVE</action>
          <value>31</value>
        </account>
        <account>
          <action>NONE</action>
          <value>32</value>
        </account>
        <account>
          <action>MODIFY</action>
          <value>33</value>
        </account>
      </emp>
    </root>
    

    <强>结果

    <root>
       <emp>
          <summary>
             <emp_id>1</emp_id>
          </summary>
       </emp>
       <emp>
          <summary>
             <emp_id>2</emp_id>
          </summary>
          <account>
             <action>NONE</action>
             <value>23</value>
          </account>
          <account>
             <action>ADD</action>
             <value>22</value>
          </account>
       </emp>
       <emp>
          <summary>
             <emp_id>3</emp_id>
          </summary>
          <account>
             <action>NONE</action>
             <value>32</value>
          </account>
          <account>
             <action>MODIFY</action>
             <value>33</value>
          </account>
       </emp>
    </root>