Search code examples
xmlvbams-accessxslt

Import just a part of a xml


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>

Solution

  • 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>