删除具有等于某个值的后代的节点

Remove nodes that has a decendent that equals some value

我想使用 XSLT 减少大 XML。我想复制整个 XML,除了:

人元素 至少 一个名为 "Enhetnavn" 的后代匹配字符串。换句话说,下面的 XML 应该输出前两个人元素,而不是最后一个:

<ArrayOfPerson>
    <Person>
        <Ansattforhold>
             <Ansatt>
                <Stillinger>
                   <Stilling>
                       <Enhetsnavn> Match </Enhetsnavn>
                   </Stilling>
             </Ansatt>
        </ansattforhold>
    </Person>
    <Person>
        <Ansattforhold>
             <Ansatt>
                <Stillinger>
                   <Stilling>
                       <Enhetsnavn> NotMatch </Enhetsnavn>
                   </Stilling>
                   <Stilling>
                       <Enhetsnavn> NotMatch </Enhetsnavn>
                   </Stilling>
             </Ansatt>
                <Stillinger>
                   <Stilling>
                       <Enhetsnavn> NotMatch </Enhetsnavn>
                   </Stilling>
                   <Stilling>
                       <Enhetsnavn> Match </Enhetsnavn>
                   </Stilling>
             </Ansatt>
        </ansattforhold>
    </Person>
    <Person>
        <Ansattforhold>
             <Ansatt>
                <Stillinger>
                   <Stilling>
                       <Enhetsnavn> NotMatch </Enhetsnavn>
                   </Stilling>
                   <Stilling>
                       <Enhetsnavn> NotMatch </Enhetsnavn>
                   </Stilling>
             </Ansatt>
                <Stillinger>
                   <Stilling>
                       <Enhetsnavn> NotMatch </Enhetsnavn>
                   </Stilling>
                   <Stilling>
                       <Enhetsnavn> NotMatch </Enhetsnavn>
                   </Stilling>
             </Ansatt>
        </ansattforhold>
    </Person>
</ArrayOfPerson>

所以我尝试了以下方法。但是,如果在循环内可以访问 Person(实际上不是),我会 return Person 的副本。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
  <xsl:template match="/ArrayOfPerson">
      <xsl:for-each select="Person/Ansattforhold/Ansatt">
          <xsl:for-each select="Stillinger/Stilling">
              <xsl:if test = "Enhetnavn = 'EHR, Austrått' or Enhetnavn = 'EHR, Trones A' or Enhetnavn = 'EHR Sone Rovik' or Enhetnavn = 'EHR, Riska' or Enhetnavn = 'EHR, Sone Lura' or Enhetnavn = 'EHR, Trones B' or Enhetnavn = 'EHR, Sone Åse' or Enhetnavn = 'EHR, Sone Åse B' or Enhetnavn = 'EHR,Byhagen B' and var_true = true">
                   <xsl:copy-of select="Person"/>
              </xsl:if>
          </xsl:for-each>
      </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

如果您想复制除某些节点之外的整个 XML,最好从 identity transform 模板开始,并为要删除的节点添加一个空模板 - 例如:

XML(格式正确!!!)

<ArrayOfPerson>
  <Person>
    <Ansattforhold>
      <Ansatt>
        <Stillinger>
          <Stilling>
            <Enhetsnavn>Match</Enhetsnavn>
          </Stilling>
        </Stillinger>
      </Ansatt>
    </Ansattforhold>
  </Person>
  <Person>
    <Ansattforhold>
      <Ansatt>
        <Stillinger>
          <Stilling>
            <Enhetsnavn>NotMatch</Enhetsnavn>
          </Stilling>
          <Stilling>
            <Enhetsnavn>NotMatch</Enhetsnavn>
          </Stilling>
        </Stillinger>
      </Ansatt>
      <Ansatt>
        <Stillinger>
          <Stilling>
            <Enhetsnavn>NotMatch</Enhetsnavn>
          </Stilling>
          <Stilling>
            <Enhetsnavn>Match</Enhetsnavn>
          </Stilling>
        </Stillinger>
      </Ansatt>
    </Ansattforhold>
  </Person>
  <Person>
    <Ansattforhold>
      <Ansatt>
        <Stillinger>
          <Stilling>
            <Enhetsnavn>NotMatch</Enhetsnavn>
          </Stilling>
          <Stilling>
            <Enhetsnavn>NotMatch</Enhetsnavn>
          </Stilling>
        </Stillinger>
      </Ansatt>
      <Ansatt>
        <Stillinger>
          <Stilling>
            <Enhetsnavn>NotMatch</Enhetsnavn>
          </Stilling>
          <Stilling>
            <Enhetsnavn>NotMatch</Enhetsnavn>
          </Stilling>
        </Stillinger>
      </Ansatt>
    </Ansattforhold>
  </Person>
</ArrayOfPerson>

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="Person[descendant::Enhetsnavn='Match']"/>

</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>
<ArrayOfPerson>
  <Person>
    <Ansattforhold>
      <Ansatt>
        <Stillinger>
          <Stilling>
            <Enhetsnavn>NotMatch</Enhetsnavn>
          </Stilling>
          <Stilling>
            <Enhetsnavn>NotMatch</Enhetsnavn>
          </Stilling>
        </Stillinger>
      </Ansatt>
      <Ansatt>
        <Stillinger>
          <Stilling>
            <Enhetsnavn>NotMatch</Enhetsnavn>
          </Stilling>
          <Stilling>
            <Enhetsnavn>NotMatch</Enhetsnavn>
          </Stilling>
        </Stillinger>
      </Ansatt>
    </Ansattforhold>
  </Person>
</ArrayOfPerson>