尝试使用 xslt 删除 xml 中的几个节点以及兄弟节点中的匹配文本
我的 xml 如下所示
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:map="http://www.w3.org/2005/xpath-functions/map">
<row>
<Keep_Name>Africa</Keep_Name>
</row>
<row>
<Keep_Name>USA</Keep_Name>
</row>
<row>
<Keep_Name>Mexico</Keep_Name>
</row>
<row>
<Keep_Name>Canada</Keep_Name>
</row>
<row>
<Keep_Name>Malaysia</Keep_Name>
</row>
<row>
<Remove_Name>Africa</Remove_Name>
</row>
<row>
<Remove_Name>Mexico</Remove_Name>
</row>
<row>
<Remove_Name>Srilanka</Remove_Name>
</row>
<row>
<Keep_Name>Bangladesh</Keep_Name>
</row>
</root>`
我需要的输出如下
`<?xml version="1.0" encoding="UTF-8"?>
<root >
<row>
<Keep_Name>USA</Keep_Name>
</row>
<row>
<Keep_Name>Canada</Keep_Name>
</row>
<row>
<Keep_Name>Malaysia</Keep_Name>
</row>
<row>
<Keep_Name>Bangladesh</Keep_Name>
</row>
</root>
` 尝试了下面的 xslt 但无法正常工作。我希望这些删除Remove_Name节点以及相同值的Keep_Name节点从输出中完全删除
`<xsl:stylesheet version="2.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="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="row[.=preceding-sibling::row/.]"/>
</xsl:stylesheet>`
在 xslt 上面尝试过这个,但它没有按预期工作。
仅当文本匹配时,请帮我删除输出中的这些 Remove_Name 和 Keep_Name 节点。`
如果我正确理解所需的逻辑,它可以实现为:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/root">
<xsl:copy>
<xsl:for-each-group select="row" group-by="Keep_Name | Remove_Name">
<xsl:if test="count(current-group())=1">
<xsl:copy-of select=".[Keep_Name]"/>
</xsl:if>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
或:
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:key name="row-by-name" match="row" use="Keep_Name | Remove_Name" />
<xsl:template match="/root">
<xsl:copy>
<xsl:copy-of select="row[Keep_Name][count(key('row-by-name', Keep_Name | Remove_Name))=1]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>