Как удалить XML узлов на основе условий с использованием XSLT? - PullRequest
0 голосов
/ 11 марта 2020

Из следующего файла XML я хочу удалить тег "ColumnBlocks" на основе одного условия. Условие - Если значение тега FixedFloat равно Float, то я хочу удалить тег ColumnBlocks из XML. Мой XML - -

<?xml version="1.0" encoding="UTF-8"?>
<FirstTag>
    <SecondTag>
        <CategoryGroups>
            <Group>
                <Category>
                    <PricingDetails>
                        <SimplePricingDetails>
                            <FixedFloat>Fixed</FixedFloat>
                        </SimplePricingDetails>
                    </PricingDetails>
                    <rowVolume>
                        <ColumnBlocks>
                            <ColumnBlock>
                                <Column>abcd</Column>                               
                            </ColumnBlock>
                            <ColumnBlock>
                                <Column>xyz</Column>                                
                            </ColumnBlock>
                        </ColumnBlocks>
                    </rowVolume>
                    <row>jsdf<row>
                </Category>
                <Category>
                    <PricingDetails>
                        <SimplePricingDetails>
                            <FixedFloat>Float</FixedFloat>
                        </SimplePricingDetails>
                    </PricingDetails>
                    <rowVolume>
                        <ColumnBlocks>
                            <ColumnBlock>
                                <Column>abcd</Column>                               
                            </ColumnBlock>
                            <ColumnBlock>
                                <Column>xyz</Column>                                
                            </ColumnBlock>
                        </ColumnBlocks>
                    </rowVolume>
                    <row>jsdf<row>
                </Category>
            </Group>
        </CategoryGroups>
    </SecondTag>
</FirstTag>

Я хочу, чтобы в конечном коде не было ColumnBlocks из категории, где значение FixedFloat равно Float. Это должно выглядеть так: XML -

<?xml version="1.0" encoding="UTF-8"?>
<FirstTag>
    <SecondTag>
        <CategoryGroups>
            <Group>
                <Category>
                    <PricingDetails>
                        <SimplePricingDetails>
                            <FixedFloat>Fixed</FixedFloat>
                        </SimplePricingDetails>
                    </PricingDetails>
                    <rowVolume>
                        <ColumnBlocks>
                            <ColumnBlock>
                                <Column>abcd</Column>                               
                            </ColumnBlock>
                            <ColumnBlock>
                                <Column>xyz</Column>                                
                            </ColumnBlock>
                        </ColumnBlocks>
                    </rowVolume>
                    <row>jsdf<row>
                </Category>
                <Category>
                    <PricingDetails>
                        <SimplePricingDetails>
                            <FixedFloat>Float</FixedFloat>
                        </SimplePricingDetails>
                    </PricingDetails>
                    <rowVolume>
                    </rowVolume>
                    <row>jsdf<row>
                </Category>
            </Group>
        </CategoryGroups>
    </SecondTag>
</FirstTag>

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Используйте шаблон преобразования идентификаторов в качестве отправной точки, а затем добавьте пустой шаблон для элементов, которые вы хотите удалить:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Category[PricingDetails/SimplePricingDetails/FixedFloat = 'Float']/rowVolume/ColumnBlocks"/>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/93dFepx

0 голосов
/ 12 марта 2020

Вы также можете попробовать наименьший код, который следующий:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="//ColumnBlocks[ancestor::Category/descendant::FixedFloat = 'Float']"/>
</xsl:stylesheet>
0 голосов
/ 12 марта 2020

Вы можете попробовать это:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ColumnBlocks">
        <xsl:choose>
            <xsl:when test="ancestor::Category/descendant::FixedFloat = 'Float'"> </xsl:when>
            <xsl:otherwise>
                <text>NO Output</text>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...