Удалить узел xml с помощью xslt - PullRequest
1 голос
/ 20 марта 2020

Я хочу удалить узел с условием, если статус в телефоне не равен 'A'

Это мой xml

<name>
    <name>
        <firstName>Yuio</firstName>
        <lastName>Kuyoshitu</lastName>
        <telephoneNav>
            <detail>
                <action>A</action>
                <number>1745</number>
            </detail>
            <detail>
                <action>P</action>
                <number>1189</number>
            </detail>
        </telephoneNav>
    </name>
    <name>
        <firstName>Huio</firstName>
        <lastName>Kuyoshitu</lastName>
        <telephoneNav>
            <detail>
                <action>P</action>
                <number>0902</number>
            </detail>
            <detail>
                <action>P</action>
                <number>0901</number>
            </detail>
        </telephoneNav>
    </name>
</name>

Если у узла имени нет номера телефона с A статус. Я хочу удалить имя узла

Это ожидаемый результат

<?xml version="1.0" encoding="utf-16"?><name>
<name>
    <firstName>Yuio</firstName>
    <lastName>Kuyoshitu</lastName>
    <telephoneNav>
       <detail>
            <action>A</action>
            <number>1745</number>
        </detail>
    </telephoneNav>
</name>

Я пытаюсь этот код.

<?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="/name/name/telephoneNav/detail[not(action = 'A')]"/>
  <xsl:template match="/name/name/telephoneNav/text()[not(normalize-space())]"/>
</xsl:stylesheet>

Но я все еще получил имя узла с пустым telephoneNav

Это мой результат

<?xml version="1.0" encoding="utf-16"?><name>
    <name>
        <firstName>Yuio</firstName>
        <lastName>Kuyoshitu</lastName>
        <telephoneNav>
           <detail>
                <action>A</action>
                <number>1745</number>
            </detail>
        </telephoneNav>
    </name>
    <name>
        <firstName>Huio</firstName>
        <lastName>Kuyoshitu</lastName>
        <telephoneNav />
    </name>
</name>

1 Ответ

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

Если у узла имени нет телефонного номера со статусом А. Я хочу удалить имя узла

Для этого вы можете сделать:

<xsl:template match="/name/name[not(telephoneNav/detail/action = 'A')]"/>

Но, похоже, вы также хотите удалить detail узлы, которые не имеют A действие. Это можно сделать с помощью:

<xsl:template match="detail[not(action = 'A')]"/>
...