Autor Zpráva
Petr Vavřinec
Profil *
Dobrý den.

Teď se asi ztrapním, ale prostě je to tak, někde jsem se ztratil, a nevím jak z toho.

Mám XML soubor. Chci udělat jeho identickou kopii, ale zúženou na konkrétní množinu výrobků. Umím si vytvořit XPatch výraz, který vrací adekvátní výsledky, ale nevím, jak ho zadat do XSLT souboru. Čili mám něco takového:

<?xml version="1.0"?>
<root>
<seznam>
<polozky>
<polozka>
<kod>1</kod>
<popis>položka 1</popis>
<typceny>
<prodejni>111</prodejni>
<nakupni>100</nakupni>
</typceny>
</polozka>
<polozka>
<kod>2</kod>
<popis>položka 2</popis>
<typceny>
<prodejni>222</prodejni>
<nakupni>200</nakupni>
</typceny>
</polozka>
</polozky>
</seznam>
</root>

Znám XPath dotaz na filtr pouze první položky:

/root/seznam/polozky/polozka[kod='1']

Jenže následující šablona vrátí jen vnitřek elementu <polozka> a ztratí se všechny elementy <root> <seznam> a <polozky> :

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:copy-of select="/root/seznam/polozky/polozka[kod='1']"/>
</xsl:template>
</xsl:stylesheet>

a následující šablona mi zas vrátí dvakrát polozku cislo jedna:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="polozka">
<xsl:copy-of select="/root/seznam/polozky/polozka[kod='1']"/>
</xsl:template>
</xsl:stylesheet>

tak já nevím, kde jsem se ztratil.

Můžete se mi smát, můžete si myslet, že jsem hloupý, stačí když poradíte, díky.

Petr Vavřinec
tiso
Profil
Nejak takto?
<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<root> 
<seznam> 
<polozky>
<xsl:copy-of select="/root/seznam/polozky/polozka[kod='1']"/> 
</polozky> 
</seznam> 
</root>
</xsl:template> 
</xsl:stylesheet>
Petr Vavřinec
Profil *
Ano i ne :-)

Výsledek je správný, to ano, ale já právě chtěl řešit těch prvních pár elementů obecně. Jasně, teď vidím, že to nemá logiku, protože stejně to obecně řešit nejde, když v tom XPath výrazu používám stejně vyjmenované elementy.

Takže bych to zadání trochu ztížil a zobecnil. Takže:

Hledám řešení, kdy se mi jeden XML dokument zkopíruje do druhého, ale s vyfiltrovanými prvky tak, aby platilo, že element <kod> má hodnotu jedna a je potomkem elementu <polozka> (obecně podle libovolné hodnoty libovolného elementu, který je potomkem elementu <polozka>).

To všechno, co je před elementem <polozka> (zřejmě se nevyhneme práce na ose parent, a v tom jsem hodně slabej) dopředu neznám a vlastně mně ani nezajímá, co tam je a jak hluboko je element <polozka>, ale hlavně aby se to celé "rodičovstvo" zkopírovalo do toho nového. A samozřejmě i správně udělalo uzavírací tagy, ale to je asi logické (ačkoli se mi to nedaří).

Takže se omlouvám za špatné zadání, teď už je to snad jasnější, nebo vlastně složitější.

Moc se omlouvám za chybné zadání a věřím, že to někdo bude schopný poradit. Každopádně Tisovi děkuji moc a moc za snahu.

Petr V.
tiso
Profil
Petr Vavřinec - aha. Myslím že by to malo ísť (momentálne neviem ako), ale premýšľam na čo by to bolo dobré a na čo to má slúžiť... Tiež ma zaujíma pôvod jednotlivých súborov (vstupné xml, xslt, výsledné xml) a čo z toho sa generuje programom, alebo píše ručne.
Petr Vavřinec
Profil *
Konkrétně toto potřebuji pro filtrování XML souborů, které slouží jako export nebo import zboží z účetního software Pohoda. Více o XML je na www.stormware.cz/xml a jde o to, že export či import má vždy kolem sebe jinou "obálku", tzn. elementy, které je třeba mít v importovaném souboru jsou zpočátku trochu jiné, než ty, které dostaneme při exportu, ale vnitřek je jakoby podobný (tzn. to mezi elementy <polozka>.

Ony ty elementy samozřejmě v reálu vypadají úplně jinak, já to jen zjednodušil, abych sem neposílal 100řádkový XML dokument.

No a proč filtrovat? Protože Pohoda umí napřímo vyexportovat zboží ze skladu jen podle filtru, kterým se určuje umístění ve skladu, ale neumí už vyfilrovat např. jenom to zboží, které je určeno pro prodej přes Internet, nebo zboží, které je složeninou z více položek zboží. A to se pak musí vyfiltrovat přes XSLT.

No a protože jsou tam ty stejné položky při importu i exportu, jen ta obálka je jiná, tak jsem to chtěl vyřešit na importované i na exportované soubory, proto jsem se to snažil vyřešit obecně. Tudíž první "pevným bodem" měl být ten element <polozka> a proto mi mělo být jedno, jak to vypadá před ním, protože tam to může být pokaždé jiné, ale i to potřebuji vždy zkopírovat.

No, nevím, jestli jsem to vysvětlil přesně...

PV

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: