Преобразование XSLT 2.0 для копирования узла, если существует дочерний узел - PullRequest
0 голосов
/ 01 мая 2020

Я должен преобразовать XML данные. Размер ввода XML огромен, поэтому нам нужно преобразовать его так, чтобы из него можно было получать только необходимые данные. Ненужные узлы должны быть опущены. Я разместил ниже образец структуры, которую мы получаем. Вход имеет несколько дочерних узлов, но мне нужно выбрать только дочерний узел с данными в образовательном узле. Я новичок в XSL преобразованиях. Я попытался написать несколько таблиц стилей, но ничего не получилось, как ожидалось.

Ввод XML:

<?xml version="1.0" encoding="UTF-8"?>
<parent>
    <child>
        <age>30</age>
        <name>
            <firstname>abc</firstname>
            <lastname>xyz</lastname>
            <middlename>v</middlename>
        </name>
        <education>
            <graduate>Yes</graduate>
            <masters>No</masters>
        </education>
        <dob>25-MAR-1990</dob>
        <location>city123</location>        
    </child>
    <child>
        <age>29</age>
        <name>
            <firstname>def</firstname>
            <lastname>123</lastname>
            <middlename>a</middlename>
        </name>
        <education/>
        <dob>25-MAR-1991</dob>
        <location>city123</location>        
    </child>
    <child>
        <age>35</age>
        <name>
            <firstname>ghi</firstname>
            <lastname>345</lastname>
            <middlename>r</middlename>
        </name>
        <education>
            <graduate>Yes</graduate>
            <masters>Yes</masters>
        </education>
        <dob>25-MAR-1985</dob>
        <location>city123</location>        
    </child>
</parent>

Ввод XML:

<parent>
    <child>
        <age>30</age>
        <name>
            <firstname>abc</firstname>
            <lastname>xyz</lastname>
            <middlename>v</middlename>
        </name>
        <education>
            <graduate>Yes</graduate>
            <masters>No</masters>
        </education>
        <dob>25-MAR-1990</dob>
        <location>city123</location>        
    </child>
    <child>
        <age>35</age>
        <name>
            <firstname>ghi</firstname>
            <lastname>345</lastname>
            <middlename>r</middlename>
        </name>
        <education>
            <graduate>Yes</graduate>
            <masters>Yes</masters>
        </education>
        <dob>25-MAR-1985</dob>
        <location>city123</location>        
    </child>
</parent>

Я использовал файл преобразования XSLT 2.0, как показано ниже, но он не работает:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/> 
    <xsl:template match= "child/education/graduate[node()]">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

1 Ответ

0 голосов
/ 01 мая 2020

Либо просто выберите нужные вам элементы с помощью

<xsl:template match="parent">
  <xsl:copy>
    <xsl:copy-of select="child[education/graduate/node()]"/>
  </xsl:copy>
</xsl:template>

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

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

<xsl:template match="child[education/graduate[not(node())]]"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...