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.
Fórum › XML / XSL(T)
Modifikace XML
#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.
Ahoj dekuji za odpoved, Windows je podminka, ta struktura vychazi z kml , google earth.
P.
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
Super, diky moc, jdu se pokusit se tim prokousat a aplikovat :-)
dekuji
P.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Modifikace prispevku — založil Aboutlukin
Autorské právo, modifikace hry — založil Zelenáč
Nefunkční MODIFIKACE + nejdou přesouvat panely — založil Martin Kokeš
GTA San Andreas Steam verze +Modifikace GGMM — založil adamjohnson
Převod XML do jiné struktury XML — založil elife
Moderátoři diskuze