Modifikace XML – XML / XSL(T) – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Modifikace XML – XML / XSL(T) – Fórum – Programujte.comModifikace XML – XML / XSL(T) – Fórum – Programujte.com

 

Petr Janarik
~ Anonymní uživatel
3 příspěvky
29. 6. 2015   #1
-
0
-

Ahoj, dobrý den,
potřeboval bych poradit ohledně automatické změny v souboru xml.
O co se jedná: mám takovouto strukturu xml, kde oněch Placemarku je třeba 1000

<Placemark>
<name>09:11:44.0000</name>
<description>
<![CDATA[TYP:999]]>
</description>
<Style>
<LineStyle>
<color>52fd9169</color><width>2</width>
</LineStyle>
<PolyStyle>
<color>52fd9169</color>
</PolyStyle>
</Style>
</Placemark>
<Placemark>
<name>09:11:44.0000</name>
<description>
<![CDATA[TYP:888]]>
</description>
<Style>
<LineStyle>
<color>52fd9169</color><width>2</width>
</LineStyle>
<PolyStyle>
<color>52fd9169</color>
</PolyStyle>
</Style>
</Placemark>

a výsledek snažení [:-)] by měl být nějaký script, který by dokázal přečíst v descripci onen TYPa následně změnit barvu v LineStyle a PolyStyle z předdefinovaných barev pro různé TYPy. (Co TYP to různá barva, v příkladu je pro různý TYP stejná barva a to potřebuji změnit)
Je možne toto vytvořit v systému Windows (Excel, NotePad++......) ?
Děkuji moc za každou pomoc.
P.

Nahlásit jako SPAM
IP: 82.117.130.–
Kit+15
Guru
29. 6. 2015   #2
-
-1
-
Mimo téma

#1 Petr Janarik
Což o to, skript bych dokázal napsat, ale ve Windows? Ani nevím, jaké tam jsou pro to nástroje - jestli tam je např. xsltproc.

Také bych dokázal navrhnout lepší strukturu toho XML, aby byl čitelnější pro lidi.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Petr Janarik
~ Anonymní uživatel
3 příspěvky
1. 7. 2015   #3
-
0
-

Ahoj dekuji za odpoved, Windows je podminka, ta struktura vychazi z kml , google earth.

P.

Nahlásit jako SPAM
IP: 2001:1a48:5:401::41...–
liborb
~ Redaktor
+18
Guru
1. 7. 2015   #4
-
+1
-
Zajímavé
Kit +

Začal bych tím, že budeš mít hezké XML, tj. jeden kořenový tag - řekněme PlacemarkList.

Pak si vytvoříme základ XSL šablony pro tranformaci XML. Výstup má být XML, řekněme v UTF-8 kódování a máš tam CDATA sekci, tak ji zachováme: 

<xsl:output method="xml" indent="yes" encoding="utf-8" cdata-section-elements="description" />

Dále chceš měnit pouze obsah tagu color a ostatní pouze kopírovat, takže základem šablony bude tzv. transformaci shodnosti:

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

No a pak už je tam jenom ta změna v tagu color, takže si vytvoříme šablonu pro tag color, ve které zatím jen zkopírujeme název tagu:

<xsl:template match="color">
	<xsl:copy>
	</xsl:copy>
</xsl:template>

A pak už jenom přidáme změnu barvy dle typu. Typ máš v CDATA sekci, takže nakonec bude nejlepší si ho z toho vykousnout (při zpracování jsme v tagu color), převést na číslo, aby se nám potom lépe porovnávalo:

number(substring-after(../../../description, ':'))

Pro větvené porovnávání se v XSLT používá konstrukce choose/when/otherwise, takže pro typ 999 bude vypadat nějak takto: 

<xsl:choose>
	<xsl:when test="number(substring-after(../../../description, ':'))=999">
		<xsl:text>abcdef</xsl:text>
	</xsl:when>
</xsl:choose>

Do části xsl:otherwise se dá dát zpracování neznámých typů buď na označení, co tam ještě nemáš nebo si tam můžeš dát výchozí barvu:

<xsl:otherwise>
	<xsl:value-of select="concat('Nepodporovany typ:', ../../../description)" />
</xsl:otherwise>

Takže výsledný XSL soubor i s hlavičkou vypadá asi takto: 

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"		
		version="1.0"
                xmlns:xt="http://www.jclark.com/xt"
                extension-element-prefixes="xt">

<xsl:output method="xml" indent="yes" encoding="utf-8" cdata-section-elements="description" />

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

<xsl:template match="color">
	<xsl:copy>
		<xsl:choose>
			<xsl:when test="number(substring-after(../../../description, ':'))=999">
				<xsl:text>abcdef</xsl:text>
			</xsl:when>
			<xsl:otherwise>				
				<xsl:value-of select="concat('Nepodporovany typ:', ../../../description)" />
			</xsl:otherwise>
		</xsl:choose>
	</xsl:copy>
</xsl:template>
	
</xsl:stylesheet>

No a když si tam budeš přidávat (kopírovat) části xsl:when, měnit číslo na porovnání a doplňovat správnou barvu, tak dostaneš to, co chceš. Pokud by si chtěl pro daný typ jinou barvu pro LineStyle a PolyStyle, tak se to ještě musí přidat do té podmínky.

Na výslednou transformaci můžeš použít třeba utilitku od Microsoftu msxml.exe. Nebo nějaký java-base třeba saxon. Použití msxml je jednouché:

msxsl -o vystupni.xml vstupni.xml sablona.xsl
Nahlásit jako SPAM
IP: 188.75.135.–
Petr Janarik
~ Anonymní uživatel
3 příspěvky
1. 7. 2015   #5
-
0
-

Super, diky moc, jdu se pokusit se tim prokousat a aplikovat :-)

dekuji

P.

Nahlásit jako SPAM
IP: 82.117.130.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý