создание динамических элементов xml с помощью xslt

Я использую XSLT для передачи значений объекта xml, так как я новичок в этой технологии, на основе значения, которое мне нужно создать для вывода элементов xml. Пожалуйста помоги мне с этим,

ниже мои требования

ввод xml

<list>
    <creature>
        <type>Animal</type>
        <explicit-path>
            <name>AnimalName</name>
            <constraints>
                <nd-ref>fourlegs</nd-ref>
                <interface>runs</interface>
            </constraints>
        </explicit-path>
    </creature>
<creature>
        <type>Bird</type>
        <explicit-path>
            <name>BirdName</name>
            <constraints>
                <nd-ref>twolegs</nd-ref>
                <interface>flies</interface>
            </constraints>
        </explicit-path>    
    </creature>     
</list>
  • Ожидаемый результат

    <Animal>
    <name>animalName</name>
    <constraints>
        <nd-ref>fourlegs</nd-ref>
        <interface>runs</interface>
    </constraints>
    </Animal>
    <Bird>
    <name>birdName</name>
    <constraints>
        <nd-ref>twolegs</nd-ref>
        <interface>flies</interface>
    </constraints>
    </Bird>
    

person Afsarnamak    schedule 19.08.2016    source источник
comment
Пожалуйста, поищите уроки в интернете, их много.   -  person Wilko van der Veen    schedule 19.08.2016


Ответы (2)


Попробуй это:

XSLT 2.0:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

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

<xsl:template match="list">
    <xsl:copy>
        <xsl:for-each select="creature">
            <xsl:element name="{type}">
                <xsl:apply-templates select="explicit-path/*"/>
            </xsl:element>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Вывод:

<list>
<Animal>
  <name>AnimalName</name>
  <constraints>
     <nd-ref>fourlegs</nd-ref>
     <interface>runs</interface>
  </constraints>
</Animal>
<Bird>
  <name>BirdName</name>
  <constraints>
     <nd-ref>twolegs</nd-ref>
     <interface>flies</interface>
  </constraints>
</Bird>
</list>
person Rudramuni TP    schedule 19.08.2016
comment
Спасибо за ваше лучшее предложение. :) - person Afsarnamak; 21.10.2019

Вы можете попробовать эту более простую таблицу стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <xsl:for-each select="list/creature">
            <xsl:element name="{type}">
                <!-- copy exactly the elements under explicit-path -->
                <xsl:copy-of select="explicit-path/*"/>
            </xsl:element>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
person Joel M. Lamsen    schedule 19.08.2016