Можно ли извлечь путь к файлу и имя файла в XSL для использования в процессе преобразования - PullRequest
0 голосов
/ 12 января 2019

У меня есть XSLT-файл, который преобразует многоузловые XML-файлы для MS Access, и мне нужно перехватить имя файла XML-файла. Я хочу использовать его как дополнительный столбец в процессе преобразования, чтобы добавить к таблицам, которые заполняются. В идеале я хотел бы вставить тег в узел "INTERFACE_BATCH" или узел PART_DETAIL.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

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

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

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

<xsl:template match="PART_DETAIL">
    <PART_DETAIL>
        <ERP_NUMBER><xsl:value-of select="../ERP_NUMBER"/></ERP_NUMBER>
        <PLANT><xsl:value-of select="../PLANT"/></PLANT>
        <PROCESS><xsl:value-of select="../PROCESS"/></PROCESS>
        <STORAGE_LOCATION><xsl:value-of select="../STORAGE_LOCATION"/></STORAGE_LOCATION>
        <xsl:apply-templates select="@*|node()"/>
    </PART_DETAIL>
</xsl:template>

РЕДАКТИРОВАТЬ ПОСТ: это данные VBA, которые я использую для загрузки и преобразования данных XML

 Private Sub btnImportData_Click()
'transform and load xml files into tables
Dim strFile As String, strPath As String
Dim xmlDoc As New MSXML2.DOMDocument60, xslDoc As New MSXML2.DOMDocument60
Dim newDoc As New MSXML2.DOMDocument60

    strPath = "\\linbs002\ABI Master Data\ES_XML\"
    strFile = Dir(strPath & "*.xml")

' LOAD XSL ONLY ONCE
    xslDoc.Load strPath & "material_new.xsl"
    On Error Resume Next
    DoCmd.SetWarnings False
    While strFile <> ""
' REINITIALIZE DOM OBJECTS
        Set xmlDoc = New MSXML2.DOMDocument60
        Set newDoc = New MSXML2.DOMDocument60

' LOAD XML SOURCE
        xmlDoc.Load strPath & strFile

' TRANSFORM SOURCE
        xmlDoc.transformNodeToObject xslDoc, newDoc
        newDoc.Save strPath & "temp.xml"

' APPEND TO TABLES
        Application.ImportXML strPath & "temp.xml", acAppendData

        strFile = Dir()
    Wend
    DoCmd.SetWarnings True

' RELEASE DOM OBJECTS
    Set xmlDoc = Nothing: Set xslDoc = Nothing: Set newDoc = Nothing

'delete unneeded tables
    DoCmd.DeleteObject acTable, "DESCRIPTOR"
    DoCmd.DeleteObject acTable, "DESCRIPTOR_PROPERTY"
    DoCmd.DeleteObject acTable, "ImportErrors"

'append data to table ES_Materials
    DoCmd.OpenQuery "EngineeringSpares", acViewNormal

'clear data from temp tables
    DoCmd.RunSQL "DELETE MATERIAL_ITEM.* FROM MATERIAL_ITEM;"
    DoCmd.RunSQL "DELETE PART_DETAIL.* FROM PART_DETAIL;"

'delete xml files from folder
    Kill strPath & "*.XML"

'advise job complete
    MsgBox "Load & Transform complete", vbInformation, "XML data upload"

End Sub

Редактировать сообщение: Я попытался добавить строку обновления, предложенную @ June7, безуспешно

' APPEND TO TABLES
    Application.ImportXML strPath & "temp.xml", acAppendData

    Debug.Print strPath & strFile
    rst.Edit
    CurrentDb.Execute "UPDATE ES_Materials SET FilePath='" & strPath & strFile & "' WHERE FilePath Is Null"
    rst.MoveNext
    rst.Update

1 Ответ

0 голосов
/ 14 января 2019

Предложить выполнить действие UPDATE для вновь импортированных записей. Я предпочитаю CurrentDb.Execute вместо DoCmd.RunSQL. По одной причине не нужно использовать DoCmd.SetWarnings.

CurrentDb.Execute "UPDATE ES_Materials SET FilePath='" & strPath & strFile & "' WHERE FilePath Is Null"

UPDATE предполагает, что поле FilePath является пустым при создании записей. Если есть вероятность, что поле содержит пустую строку, попробуйте другие критерии:
"' WHERE FilePath & '' = ''"

...