I´m new to XML but have to import data from it. But not the whole XML, just an argument from a subnode and the ID´s from the parent nodes. Therefore I configured a XSLT-file, which is obviously wrong. The XSLT-File:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- Identity Transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="langtext">
<xsl:copy>
<xsl:copy-of select="ancestor::uid_ungeteiltepos"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
My code creates an empty xml with blanks (bl/) where a different company fills in there values. So I get the completed XML back with data like:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<onlv xmlns="http://www.oenorm.at/schema/A2063/2021-03-01">
<metadaten></metadaten>
<leistungstabelle></leistungstabelle>
<zztabelle></zztabelle>
<akztabelle></akztabelle>
<zugelassenenachlaesse></zugelassenenachlaesse>
<ausschreibungs-lv>
<kenndaten></kenndaten>
<og-liste>
<og nr="01">
<og-eigenschaften></og-eigenschaften>
<svb></svb>
<lg-liste>
<lg nr="01"></lg>
<lg nr="02">
<lg-eigenschaften></lg-eigenschaften>
<ulg-liste>
<ulg nr="01">
<ulg-eigenschaften>
<ueberschrift>tec: ulg0</ueberschrift>
<herkunftskennzeichen>Z</herkunftskennzeichen>
</ulg-eigenschaften>
<positionen>
</positionen>
<uid_ulg>01.02.01</uid_ulg>
</ulg>
<ulg nr="04">
<ulg-eigenschaften>
<ueberschrift>EG</ueberschrift>
<herkunftskennzeichen>Z</herkunftskennzeichen>
</ulg-eigenschaften>
<positionen>
<grundtextnr nr="01">
<ungeteilteposition mfv="">
<pos-eigenschaften>
<stichwort>Induktionsherd mit 2 Heizzonen</stichwort>
<langtext>
<p>Fabrikat: <bl>Honda</bl></p><p>Type: <bl>Crosstourer</bl></p><p>Länge: <bl>1850</bl> cm</p><p>Breite: <bl>550</bl> cm</p><p>Höhe: <bl>1650</bl> cm</p>
</langtext>
<kennwerte></kennwerte>
<herkunftskennzeichen>Z</herkunftskennzeichen>
<grafiklinks></grafiklinks>
<einheit>Stk</einheit>
<pzzv>
<eventualposition>
</eventualposition>
</pzzv>
<wesentlicheposition></wesentlicheposition>
<leistungsteil>1</leistungsteil>
<lvmenge>1</lvmenge>
</pos-eigenschaften>
</ungeteilteposition>
</grundtextnr>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<grundtextnr nr="02">
<ungeteilteposition mfv="">
<pos-eigenschaften>
<stichwort>Kühlwanne 5xGN1/1 - IDEAL AKE - zentralgekühlt/Umluft</stichwort>
<langtext>
<p>Bieterlücke: <bl>2000</bl></p>
</langtext>
<kennwerte></kennwerte>
<herkunftskennzeichen>Z</herkunftskennzeichen>
<grafiklinks></grafiklinks>
<einheit>Stk</einheit>
<pzzv>
<eventualposition>
</eventualposition>
</pzzv>
<wesentlicheposition>W</wesentlicheposition>
<leistungsteil>1</leistungsteil>
<lvmenge>1</lvmenge>
</pos-eigenschaften>
</ungeteilteposition>
</grundtextnr>
<uid_ungeteiltepos>01.02.04.02</uid_ungeteiltepos>
</positionen>
<uid_ulg>01.02.04</uid_ulg>
</ulg>
</ulg-liste>
<uid_lg>01.02</uid_lg>
</lg>
</lg-liste>
<uid_og>01</uid_og>
</og>
</og-liste>
</ausschreibungs-lv>
</onlv>
The expected output in XML:
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2023-10-11T09:08:09">
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Fabrikat</p>
<bl>Honda</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Type</p>
<bl>Crosstourer</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Länge</p>
<bl>1850</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Breite</p>
<bl>550</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Höhe</p>
<bl>1650</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.02</uid_ungeteiltepos>
<p>Bieterlücke</p>
<bl>2000</bl>
</onlv>
</dataroot>
When I start importing the data via VBA i get the tables set up and most of the data. What I don´t get is the values uid_ungeteiltepos, the argument p and the value from bl.
... mostly guessing does a great job. What I don´t understand is why i get an XML where the values ob bl are missing:
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2023-10-11T09:08:09">
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Fabrikat</p>
<bl>Honda</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Type</p>
<bl>Crosstourer</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Länge</p>
<bl>1850</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Breite</p>
<bl>550</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Höhe</p>
<bl>1650</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.02</uid_ungeteiltepos>
<p>Bieterlücke</p>
<bl>2000</bl>
</onlv>
</dataroot>
I am mostly guessing here, but it seems like you want to do something like:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:oen="http://www.oenorm.at/schema/A2063/2021-03-01"
exclude-result-prefixes="oen">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<dataroot>
<xsl:for-each select="//oen:grundtextnr">
<xsl:variable name="uid_ungeteiltepos" select="following-sibling::oen:uid_ungeteiltepos[1]" />
<xsl:for-each select=".//oen:langtext/oen:p">
<onlv>
<uid_ungeteiltepos>
<xsl:value-of select="$uid_ungeteiltepos"/>
</uid_ungeteiltepos>
<p>
<xsl:value-of select="substring-before(., ':')"/>
</p>
<bl>
<xsl:value-of select="oen:bl"/>
</bl>
</onlv>
</xsl:for-each>
</xsl:for-each>
</dataroot>
</xsl:template>
</xsl:stylesheet>
With the (updated)(now 3rd) XML input you provided, this will return:
<?xml version="1.0" encoding="utf-8"?>
<dataroot>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Fabrikat</p>
<bl>Honda</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Type</p>
<bl>Crosstourer</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Länge</p>
<bl>1850</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Breite</p>
<bl>550</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.01</uid_ungeteiltepos>
<p>Höhe</p>
<bl>1650</bl>
</onlv>
<onlv>
<uid_ungeteiltepos>01.02.04.02</uid_ungeteiltepos>
<p>Bieterlücke</p>
<bl>2000</bl>
</onlv>
</dataroot>