IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petr Vavřinec:9.6.2020 11:33

Ahoj. Dělám si nějakou XSLT transformaci XML feedu zboží. A došlo mi, že nevím, proč a kdy přesně používat <xsl:element> ?

Proč bych měl použít například toto:

<xsl:element name="nazev">
      <xsl:value-of select="title" />
</xsl:element>

Když stačí použít toto:

<nazev>
    <xsl:value-of select="title" />
</nazev>

???

A také by mne zajímalo, jak se rozhodujete, zda data vložíte do elementu, nebo zda data vložíte do atributu??? Jasně, četl jsem poučku typu "data do elementu, metadata do atributu", ale přiznám se, že přesně neumím rozlišit, jestli konkrétní položku (významově i obsahem) mám chápat jako data nebo jako metadata. Podle čeho se rozhodujete vy, kdy to dát do elementu a kdy do atributu??

Děkuji moc za Vaše názory:

Zkusil jsem: XML:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
  <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
  </cd>
</catalog>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="catalog">
        <xsl:for-each select="cd">
            <xsl:element name="nazev">
                <xsl:value-of select="title" />
            </xsl:element>
            <nazev2>
                <xsl:value-of select="title" />
            </nazev2>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Chci docílit: <nazev> i <nazev2> je to to samé. Takže nechápu, kdy použít tu a kdy tu druhou konstrukci a hlavně proč?

 
Odpovědět
9.6.2020 11:33
Avatar
Petr Vavřinec:11.6.2020 14:25

No, tak jsem hledal a přemýšlel, tak snad nějakému jinému začátečníkovi pomůže, na co jsem přišel.
Odpověď na otázku "Proč a kdy použít <xsl:element name="nazev"> a kdy použít <nazev>?"

  1. Pokud dopředu znám jméno mnou zamýšleného elementu, asi není problém použít <nazev> rovnou.

2 Pokud potřebuju jméno mnou zamýšleného elementu nechat vygenerovat na základě nějakých hodnot, které dopředu neznám, pak musím použít <xsl:element>

Například mám takovéhle XML, které dopředu moc neznám a má většinu dat uložených v atributech a já z každého atributu chci udělat samostatný element a zároveň stávající elementy také zkopírovat.

XML:

<?xml version="1.0" encoding="utf-8"?>
<Result>
  <StoItem Id="30437" Code="CARX1034" EAN="2000000005003"/>
  <StoItem Id="30490" Code="TONX1645" EAN="2000000000176" EAN2="8585000630102"/>
  <StoItem Id="30491" Code="TONX1646" EAN="5017534935185">
        <item>Notebook jak vyšitý</item>
  </StoItem>
  <StoItem Id="30496" Code="TONX1650" EAN2="2000000000114" PID="8585000630188"/>
  <StoItem Id="30497" Code="TONX1651" EAN="5017534970261"/>
  <StoItem Id="30511" Code="TONX1660" EAN="8585000635077" jinykod="2000000000558"/>
</Result>

XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:strip-space elements="*"/>

 <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="@*">
    <xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element>
  </xsl:template>
</xsl:stylesheet>

Snad to někomu pomůže.

Petr V.

 
Nahoru Odpovědět
11.6.2020 14:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.