Я новичок в XML, но мне нужно импортировать из него данные. Но не весь XML, а просто аргумент из подузла и идентификаторы из родительских узлов. Поэтому я настроил XSLT-файл, что явно неправильно. XSLT-файл:
<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>
Мой код создает пустой XML-файл с пробелами (bl/), в который другая компания заполняет значения. Итак, я получаю готовый XML с такими данными, как:
<?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>
Ожидаемый результат в 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>
Когда я начинаю импортировать данные через VBA, я настраиваю таблицы и большую часть данных. Чего я не получаю, так это значений uid_ungeteiltepos, аргумента p и значения из bl.
... в основном угадывание помогает. Чего я не понимаю, так это почему я получаю XML, в котором отсутствуют значения ob bl:
<?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>
Это может быть полезно... davetallett26.github.io/parsexml.html





У вас есть пространство имен по умолчанию. Я рекомендую использовать сценарий Powershell вместо VBA, чтобы получить файл csv. Код может нуждаться в небольшой модификации. В вашем XML-файле отсутствуют некоторые детали. Похоже, вы можете удалить некоторую информацию.
using assembly System.Xml.Linq
$inputFilename = "c:\temp\test.xml"
$outputFilename = "c:\temp\test.csv"
$doc = [System.Xml.Linq.XDocument]::Load($inputFilename)
$ns = $doc.Root.GetDefaultNamespace()
$lgs = $doc.Descendants($ns + "lg")
$table = [System.Collections.ArrayList]@()
foreach($lg in $lgs)
{
$ps = $lg.Descendants($ns + 'p')
$uid_ungeteiltepos = $lg.Descendants($ns + 'uid_ungeteiltepos')[0].Value
foreach($p in $ps)
{
$pValue = $p.FirstNode.Value
$bls = $lg.Descendants($ns + 'bl')
foreach($bl in $bls)
{
$blValue = $bl.FirstNode.Value
$newRow = [PSCustomObject]@{
'uid_ungeteiltepos' = $uid_ungeteiltepos
'p' = $pValue
'bl' = $blValue
}
}
}
$table.Add($newRow)
}
$table | Export-Csv -Path $outputFilename -NoTypeInformation
Я в основном предполагаю здесь, но похоже, что вы хотите сделать что-то вроде:
<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>
С помощью (обновленного) (теперь третьего) предоставленного вами XML-входа вы получите:
<?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>
Отличная работа, но, пожалуйста, взгляните на мой отредактированный пост. Спасибо заранее!
Я не получаю того результата, о котором вы заявляете. Подскажите пожалуйста простой способ воспроизвести проблему.
Я только что изменил атрибут <langtext>, потому что произошла ошибка. Теперь это должно быть проще. Пожалуйста, взгляните на него еще раз.
Это еще проще. Я отредактировал свой ответ. P.S. langtext — это элемент, а не атрибут.
Большой. И последнее: сначала я предоставил сокращенный XML, включая значения. Вероятно, поэтому для значений «Bieterlücke» указано «01.02.04.01» | '2000', где должно быть значение '01.02.04.02'. Не могли бы вы взглянуть на это? Спасибо заранее!
Вот что происходит, когда все, что нам нужно для работы, — это пример без четкого формулирования логики, которой следует следовать. Я скорректировал свой ответ, но все еще в основном предполагаю.
Большое спасибо за улучшение. Теперь это работает хорошо! Большое спасибо!
Пожалуйста, предоставьте минимальный воспроизводимый пример , показывающий входные данные XML, ваш XSLT и ожидаемый результат (в виде XML). Наиболее вероятная причина: stackoverflow.com/a/34762628/3016153