XSLT 过滤模板

问题描述 投票:0回答:1

我有输入xml:

<PerNationalId>
    <PerNationalId>
      <nationalId>999.999.868-88</nationalId>
      <personNav>
        <PerPerson>
          <employmentNav>
            <EmpEmployment>
              <empWorkPermitNav>
                <EmpWorkPermit>
                  <documentNumber>27122165960</documentNumber>
                  <issuePlaceNav/>
                  <customString3/>
                  <documentTypeNav>
                    <PicklistOption>
                      <externalCode>6</externalCode>
                    </PicklistOption>
                  </documentTypeNav>
                </EmpWorkPermit>      
              </empWorkPermitNav>
              <jobInfoNav>
                <EmpJob>
                  <emplStatusNav>
                    <PicklistOption>
                      <externalCode>T</externalCode>
                    </PicklistOption>
                  </emplStatusNav>
                  <company>0004</company>
                </EmpJob>
              </jobInfoNav>
              <userId>60020077</userId>
            </EmpEmployment>
            <EmpEmployment>
              <empWorkPermitNav>
                <EmpWorkPermit>
                  <documentNumber>320008725351</documentNumber>
                  <issuePlaceNav/>
                  <customString3/>
                  <documentTypeNav>
                    <PicklistOption>
                      <externalCode>3</externalCode>
                    </PicklistOption>
                  </documentTypeNav>
                </EmpWorkPermit> 
              </empWorkPermitNav>
              <jobInfoNav>
                <EmpJob>
                  <emplStatusNav>
                    <PicklistOption>
                      <externalCode>A</externalCode>
                    </PicklistOption>
                  </emplStatusNav>
                  <company>0004</company>
                </EmpJob>
              </jobInfoNav>
              <userId>20028939</userId>
            </EmpEmployment>
          </employmentNav>
        </PerPerson>
      </personNav>
    </PerNationalId>
  </PerNationalId>

我需要以下输出:

<PerNationalId>
    <PerNationalId>
      <nationalId>999.999.868-88</nationalId>
      <personNav>
        <PerPerson>
          <employmentNav>
            <EmpEmployment>
              <empWorkPermitNav>
                <EmpWorkPermit>
                  <documentNumber>320008725351</documentNumber>
                  <issuePlaceNav/>
                  <customString3/>
                  <documentTypeNav>
                    <PicklistOption>
                      <externalCode>3</externalCode>
                    </PicklistOption>
                  </documentTypeNav>
                </EmpWorkPermit> 
              </empWorkPermitNav>
              <jobInfoNav>
                <EmpJob>
                  <emplStatusNav>
                    <PicklistOption>
                      <externalCode>A</externalCode>
                    </PicklistOption>
                  </emplStatusNav>
                  <company>0004</company>
                </EmpJob>
              </jobInfoNav>
              <userId>20028939</userId>
            </EmpEmployment>
          </employmentNav>
        </PerPerson>
      </personNav>
    </PerNationalId>
  </PerNationalId>

基本上,当节点 EmpEmployment 内的子节点 /jobInfoNav/EmpJob/emplStatusNav/PicklistOption/externalCode 的值等于 T 时,我需要删除节点 EmpEmployment。

你能帮我吗?

谢谢。

我尝试了以下 XSLT,但它只删除了 emplStatusNav 标签

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.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="*"/>
 <xsl:template match="@*|node()">
  <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
 </xsl:template>
 <xsl:template match="/PerNationalId/PerNationalId/personNav/PerPerson/employmentNav/EmpEmployment/jobInfoNav/EmpJob/emplStatusNav/PicklistOption[(externalCode= 'T')]"/>
</xsl:stylesheet>
xslt-2.0
1个回答
0
投票

XSLT 3(在线摆弄):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all">

  <xsl:mode on-no-match="shallow-copy"/>
  
  <xsl:template match="EmpEmployment[jobInfoNav/EmpJob/emplStatusNav/PicklistOption/externalCode = 'T']"/>

</xsl:stylesheet>

XSLT 2(在线摆弄):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all">

  <xsl:template match="@* | node() | document-node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="EmpEmployment[jobInfoNav/EmpJob/emplStatusNav/PicklistOption/externalCode = 'T']"/>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.