删除具有等于某个值的后代的节点
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>
我想使用 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>