使用XSLT转换XML以创建父子关系(将数据加载到AccessDB中

时间:2018-09-30 12:21:01

标签: xml vba macos ms-access xslt

我有如下所述的源XML ...

<?xml version="1.0" encoding="UTF-8"?><tns:DATA xmlns:soap-env="*****" xmlns:tns="****" xmlns:nxsd="*****"><tns:Information><tns:tenantId>PARENT_STRING1</tns:tenantId><tns:userSessionId>PARENT_STRING2</tns:userSessionId><tns:startTime>PARENT_STRING3</tns:startTime><tns:endTime>PARENT_STRING4</tns:endTime><tns:duration>PARENT_STRING5</tns:duration><tns:userActions><tns:name>CHILD_STRING1</tns:name><tns:domain>CHILD_STRING2</tns:domain>    <tns:targetUrl>CHILD_STRING3</tns:targetUrl><tns:type>CHILD_STRING4</tns:type>... etc</tns:userActions>....etc</tns:Information></tns:DATA>

我想将其转换为

<?xml version="1.0" encoding="UTF-8"?><tns:DATA xmlns:soap-env="*****" xmlns:tns="****" xmlns:nxsd="*****"><tns:Information><tns:tenantId>PARENT_STRING1</tns:tenantId><tns:userSessionId>PARENT_STRING2</tns:userSessionId><tns:startTime>PARENT_STRING3</tns:startTime><tns:endTime>PARENT_STRING4</tns:endTime><tns:duration>PARENT_STRING5</tns:duration><tns:userActions><tns:userSessionId>PARENT_STRING2</tns:userSessionId><tns:startTime>PARENT_STRING3</tns:startTime><tns:endTime>PARENT_STRING4</tns:endTime><tns:duration>PARENT_STRING5</tns:duration><tns:name>CHILD_STRING1</tns:name><tns:domain>CHILD_STRING2</tns:domain><tns:targetUrl>CHILD_STRING3</tns:targetUrl><tns:type>CHILD_STRING4</tns:type>... etc</tns:userActions>....etc</tns:Information></tns:DATA>

我正在使用XSLT,如下所述,

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

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

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

<xsl:template match="tns:userActions">
    <tns:userActions>
        <tns:tenantId><xsl:value-of select="../tns:tenantId"/></tns:tenantId>
        <tns:ParentStartTime><xsl:value-of select="../tns:startTime"/></tns:ParentStartTime>
        <tns:ParentEndTime><xsl:value-of select="../tns:endTime"/></tns:ParentEndTime>
        <xsl:apply-templates select="@*|node()"/>
    </tns:userActions>
</xsl:template>

XSLT无法正常工作,XML无法转换为我期望的格式。能否请您突出显示我在这里缺少的东西... ???

非常感谢!!

我的VBA代码部分如下所述

  ' LOAD XML SOURCE
  'xmlDoc.Load strPath & strFile
  xmlDoc.Load strPath & strFile

  If (xmlDoc.parseError.errorCode <> 0) Then
    MsgBox ("Error loading source document: " & xmlDoc.parseError.reason)
    Exit Sub
    Else
  If (xslDoc.parseError.errorCode <> 0) Then
    MsgBox ("Error loading stylesheet document: " & xslDoc.parseError.reason)
    Exit Sub
    Else
     ' Do the transform.
     xmlDoc.transformNodeToObject xslDoc, newDoc
     newDoc.Save "C:\temp\temp.xml"
     Application.ImportXML "C:\temp\temp.xml", acAppendData
     strFile = Dir()
  End If
  End If

  ' TRANSFORM SOURCE
  'xmlDoc.transformNodeToObject xslDoc, newDoc

  'newDoc.Save "C:\temp\temp.xml"

  ' APPEND TO TABLES
  ' Application.ImportXML "C:\temp\temp.xml", acAppendData
  ' strFile = Dir()

1 个答案:

答案 0 :(得分:0)

您的XSLT样式表工作正常,您只需删除tns:Information的模板。

我必须修复名称空间,不能只用星号替换它们。

在此处检查小提琴:http://xsltransform.net/bEJaogP