как получить дочерний тег вместе с другим родительским тегом из xml, используя xslt - PullRequest
0 голосов
/ 13 марта 2012

Рассмотрим ниже входной XML-файл

 <Content>
      <content1>
         <first> Hi  <dynVar name="abc" /> All </first>
         <second>this is</second>
      <content1>
      <third>input <dynVar name="def" /> xml content</third>
      <fourth> <dynVar name="ghi" /> </fourth>
      <fifth> <dynVar name="jkl" /> <dynVar name="mno" /></fifth>
 <Content>

используя вышеуказанный xml-файл, я хочу написать xslt, чтобы мой выходной xml-файл после трансформация будет выглядеть ниже Целевой XML-файл:

 <aaa>
     <bbb>
         <ccc> Hi  <dynVar name="abc" /> All </ccc>
         <ddd>this is</ddd>
     <bbb>
     <eee>input <dynVar name="def" /> xml content</eee>
     <fff> <dynVar name="ghi" /> </fff>
     <ggg> <dynVar name="jkl" /> <dynVar name="mno" /></ggg>
 <aaa>

и выходной файл не должен содержать любое из пространств имен, связанных с входной XML-файл Кто-нибудь может дать решение для этого?

1 Ответ

1 голос
/ 13 марта 2012

Попробуйте это (см. Также более короткую версию в конце):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

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

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

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

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

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

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

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

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

</xsl:stylesheet>

Применительно к вашему входу, это дает

<?xml version="1.0" encoding="UTF-8"?>
<aaa>
    <bbb>
        <ccc> Hi  <dynVar name="abc"/> All </ccc>
        <ddd>this is</ddd>
    </bbb>
    <eee>input <dynVar name="def"/> xml content</eee>
    <fff>
        <dynVar name="ghi"/>
    </fff>
    <ggg>
        <dynVar name="jkl"/>
        <dynVar name="mno"/>
    </ggg>
</aaa>

Для исключения пространств имен добавьте атрибут exclude-result-prefixes = "x y z" к элементу таблицы стилей, где x, y и z - это пространства имен, объявленные дополнительно.

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

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

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

    <xsl:template match="*[name() != 'dynVar']">
        <xsl:variable name="eltName">
            <xsl:choose>
                <xsl:when test="name()='Content'">aaa</xsl:when>
                <xsl:when test="name()='content1'">bbb</xsl:when>
                <xsl:when test="name()='first'">ccc</xsl:when>
                <xsl:when test="name()='second'">ddd</xsl:when>
                <xsl:when test="name()='third'">eee</xsl:when>
                <xsl:when test="name()='fourth'">fff</xsl:when>
                <xsl:when test="name()='fifth'">ggg</xsl:when>
                <xsl:otherwise>error</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:element name="{$eltName}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...