我想用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,除了一些节点,最好从下面的 身份转换 模板,并为您要删除的节点添加一个空模板--例如。
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>