使用 xslt 删除 xml 中的几个节点以及兄弟节点中的匹配文本

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

尝试使用 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 节点。`

xml xslt xml-parsing
1个回答
0
投票

如果我正确理解所需的逻辑,它可以实现为:

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