移除有等于某个值的下级的节点

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

我想用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在循环内是可以到达的(它不是),我将返回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 xslt xslt-1.0 xslt-2.0
1个回答
0
投票

如果你想复制整个XML,除了一些节点,最好从下面的 身份转换 模板,并为您要删除的节点添加一个空模板--例如。

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>
© www.soinside.com 2019 - 2024. All rights reserved.