【发布时间】:2021-03-17 18:19:03
【问题描述】:
我有以下 XML 数据,我需要过滤某些 XML 节点并使用这些节点形成另一个 XML 数据,它是祖先节点以及它的所有子节点。我是 XSLT 的新手,并尝试了使用 XSLT 的不同方法,但没有任何效果。
这是否可以在 XSLT 中实现?
数据:
<?xml version="1.0" encoding="UTF-8"?>
<MessageDetails>`enter code here`
<challengeDetails>
<challengeId>1000000017</challengeId>
<challengeCode>WEEKACTIVE</challengeCode>
<challengeCategory>StayActive</challengeCategory>
<challengePeriodsDetails>
<periodId>1000000064</periodId>
<periodNumber>2</periodNumber>
<periodStatus>INPROGRESS</periodStatus>
<challengeAwardIssued>
<awardType>GAME</awardType>
<awardCode>GCH009</awardCode>
</challengeAwardIssued>
<challengeAwardIssued>
<awardType>REWARD</awardType>
<awardCode>EHNC001</awardCode>
</challengeAwardIssued>
</challengePeriodsDetails>
<challengePeriodsDetails>
<periodId>1000000065</periodId>
<periodNumber>3</periodNumber>
<periodStatus>COMPLETED</periodStatus>
<challengeAwardIssued>
<awardType>REWARD</awardType>
<awardCode>EHNC002</awardCode>
</challengeAwardIssued>
</challengePeriodsDetails>
</challengeDetails>
<challengeDetails>
<challengeId>1000000018</challengeId>
<challengeCode>QUITSUGAR</challengeCode>
<challengeCategory>QuitSugar</challengeCategory>
<challengePeriodsDetails>
<periodId>1000000066</periodId>
<periodNumber>2</periodNumber>
<periodStatus>INPROGRESS</periodStatus>
<challengeAwardIssued>
<awardType>REWARD</awardType>
<awardCode>EHNC001</awardCode>
</challengeAwardIssued>
</challengePeriodsDetails>
<challengePeriodsDetails>
<periodId>1000000067</periodId>
<periodNumber>3</periodNumber>
<periodStatus>COMPLETED</periodStatus>
<challengeAwardIssued>
<awardType>GAME</awardType>
<awardCode>EHNC001</awardCode>
</challengeAwardIssued>
</challengePeriodsDetails>
</challengeDetails>
</MessageDetails>
搜索条件 #1:awardType = GAME
<?xml version="1.0" encoding="UTF-8"?>
<MessageDetails>
<challengeDetails>
<challengeId>1000000017</challengeId>
<challengeCode>WEEKACTIVE</challengeCode>
<challengeCategory>StayActive</challengeCategory>
<challengePeriodsDetails>
<periodId>1000000064</periodId>
<periodNumber>2</periodNumber>
<periodStatus>INPROGRESS</periodStatus>
<challengeAwardIssued>
<awardType>GAME</awardType>
<awardCode>GCH009</awardCode>
</challengeAwardIssued>
</challengePeriodsDetails>
</challengeDetails>
<challengeDetails>
<challengeId>1000000018</challengeId>
<challengeCode>QUITSUGAR</challengeCode>
<challengeCategory>QuitSugar</challengeCategory>
<challengePeriodsDetails>
<periodId>1000000067</periodId>
<periodNumber>3</periodNumber>
<periodStatus>COMPLETED</periodStatus>
<challengeAwardIssued>
<awardType>GAME</awardType>
<awardCode>GCH008</awardCode>
</challengeAwardIssued>
</challengePeriodsDetails>
</challengeDetails>
</MessageDetails>
搜索条件 #2:awardType = GAME 和 periodStatus = COMPLETED 和 challengeCode = QUITSUGAR
<?xml version="1.0" encoding="UTF-8"?>
<MessageDetails>
<challengeDetails>
<challengeId>1000000018</challengeId>
<challengeCode>QUITSUGAR</challengeCode>
<challengeCategory>QuitSugar</challengeCategory>
<challengePeriodsDetails>
<periodId>1000000067</periodId>
<periodNumber>3</periodNumber>
<periodStatus>COMPLETED</periodStatus>
<challengeAwardIssued>
<awardType>GAME</awardType>
<awardCode>GCH008</awardCode>
</challengeAwardIssued>
</challengePeriodsDetails>
</challengeDetails>
</MessageDetails>
搜索条件 #3:challengeCode = WEEKACTIVE & periodId = 1000000064
<?xml version="1.0" encoding="UTF-8"?>
<MessageDetails>
<challengeDetails>
<challengeId>1000000017</challengeId>
<challengeCode>WEEKACTIVE</challengeCode>
<challengeCategory>StayActive</challengeCategory>
<challengePeriodsDetails>
<periodId>1000000064</periodId>
<periodNumber>2</periodNumber>
<periodStatus>INPROGRESS</periodStatus>
<challengeAwardIssued>
<awardType>GAME</awardType>
<awardCode>GCH009</awardCode>
</challengeAwardIssued>
</challengePeriodsDetails>
</challengeDetails>
</MessageDetails>
搜索条件 #4:periodId = 1000000066
<?xml version="1.0" encoding="UTF-8"?>
<MessageDetails>
<challengeDetails>
<challengeId>1000000018</challengeId>
<challengeCode>QUITSUGAR</challengeCode>
<challengeCategory>QuitSugar</challengeCategory>
<challengePeriodsDetails>
<periodId>1000000066</periodId>
<periodNumber>2</periodNumber>
<periodStatus>INPROGRESS</periodStatus>
<challengeAwardIssued>
<awardType>REWARD</awardType>
<awardCode>EHNC001</awardCode>
</challengeAwardIssued>
</challengePeriodsDetails>
</challengeDetails>
</MessageDetails>
搜索条件 #5:awardType = 'GAME' 和 AwardCode='EHNC001'
需要的输出:
<?xml version="1.0" encoding="UTF-8"?>
<MessageDetails>`enter code here`
<challengeDetails>
<challengeId>1000000018</challengeId>
<challengeCode>QUITSUGAR</challengeCode>
<challengeCategory>QuitSugar</challengeCategory>
<challengePeriodsDetails>
<periodId>1000000067</periodId>
<periodNumber>3</periodNumber>
<periodStatus>COMPLETED</periodStatus>
<challengeAwardIssued>
<awardType>GAME</awardType>
<awardCode>EHNC001</awardCode>
</challengeAwardIssued>
</challengePeriodsDetails>
</challengeDetails>
</MessageDetails>
收到的输出:
<?xml version="1.0" encoding="UTF-8"?>
<MessageDetails>`enter code here`
<challengeDetails>
<challengeId>1000000017</challengeId>
<challengeCode>WEEKACTIVE</challengeCode>
<challengeCategory>StayActive</challengeCategory>
<challengePeriodsDetails>
<periodId>1000000064</periodId>
<periodNumber>2</periodNumber>
<periodStatus>INPROGRESS</periodStatus>
</challengePeriodsDetails>
</challengeDetails>
<challengeDetails>
<challengeId>1000000018</challengeId>
<challengeCode>QUITSUGAR</challengeCode>
<challengeCategory>QuitSugar</challengeCategory>
<challengePeriodsDetails>
<periodId>1000000067</periodId>
<periodNumber>3</periodNumber>
<periodStatus>COMPLETED</periodStatus>
<challengeAwardIssued>
<awardType>GAME</awardType>
<awardCode>EHNC001</awardCode>
</challengeAwardIssued>
</challengePeriodsDetails>
</challengeDetails>
</MessageDetails>
使用的 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/MessageDetails/challengeDetails[not(challengePeriodsDetails/challengeAwardIssued/awardType = 'GAME' and challengePeriodsDetails/challengeAwardIssued/awardCode= 'EHNC001')]" />
<xsl:template match="/MessageDetails/challengeDetails/challengePeriodsDetails[not(challengeAwardIssued/awardType = 'GAME' and challengeAwardIssued/awardCode= 'EHNC001')]" />
<xsl:template match="/MessageDetails/challengeDetails/challengePeriodsDetails/challengeAwardIssued[not(awardType = 'GAME' and awardCode= 'EHNC001')]" />
<xsl:mode on-no-match="shallow-copy" />
<xsl:output method="xml" indent="yes" />
</xsl:stylesheet>
【问题讨论】:
-
我会在您的程序代码中使用 XML 和 XPath。读取每个标准 XML,并在原始 XML 中标记匹配的元素。然后删除所有不匹配的元素,并将 XML 保存为副本。
-
感谢@WilliamWalseth 的回复。让我也检查一下。
标签: xml xslt xsd xml-parsing xslt-3.0