Как написать XSL-преобразование, которое удаляет определенные элементы XML - PullRequest
0 голосов
/ 27 июня 2018

Вот пример: xml

<root>
    <type1></type1>
    <type2></type2>
    <type3>
        <child>3</child>
    </type3>
    <type4></type4>
    <type5></type5>
    <type6></type6>
    <type7>
        <child>7</child>
    </type7>
</root>

Я хочу удалить все элементы, кроме type3 и type7, чтобы это выглядело так:

<root>
    <type3>
        <child>3</child>
    </type3>
    <type7>
        <child>7</child>
    </type7>
</root>

Я новичок в xsl, и это то, что я пытался

<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/" >
<xsl:apply-templates/>
  </xsl:template>

  <xsl:template name="Type3">
    <xsl:copy-of select="*"/>
  </xsl:template>

 <xsl:template name="Type7">
    <xsl:copy-of select="*"/>
  </xsl:template>

</xsl:stylesheet>

Это, однако, просто выводит внутренние 3 и 7 из дочерних узлов. Что не так с моим мышлением здесь?

Обновление:

Хотя приведенный ниже ответ сработал для этого случая, сейчас я застрял в этом вопросе. У меня есть xml

<root>
    <type1></type1>
    <type2>
        <text>
           This is a test
        </text>
    </type2>

    <type3>
        <child>3</child>
    </type3>
    <type4></type4>
    <type5></type5>
    <type6></type6>
    <type7>
        <child>7</child>
    </type7>
</root>

XSl предоставил выходы:

<root>
    This is a test
    <type3>
      <child>3></child>
    </type3>
    <type7>
      <child>7</child>
    </type7>
</root>

Как убрать текст "это тест" из отображения в окончательном XML, не затрагивая внутренние данные узлов, которые я хочу сохранить?

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете использовать модифицированный шаблон идентификации с подходом белого списка:

<xsl:template match="root | node()[ancestor-or-self::type3] | node()[ancestor-or-self::type7] | comment() | processing-instruction() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template> 

<xsl:template match="text()" />     <!-- remove all text() nodes unless they are whitelisted -->

Эта копия

  • root, type3 и type7 элементы
  • все дочерние элементы type3 и type7 элементов
  • все комментарии, инструкции по обработке и атрибуты
  • весь текст, который является потомком type3 или type7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...