如何在XSLT上生成doctype XML文件

时间:2018-04-18 08:56:47

标签: xml vba excel-vba xslt-2.0 xpath-2.0

我需要在XSLT FILE的帮助下将XML格式转换为doctype XML格式。源文件是普通的XML。

根据我的目标文件,我需要:

<!DOCTYPE Pip3B3ShipmentStatusNotification SYSTEM "3B3_MS_R01_00_ShipmentStatusNotification.dtd">

我的xslt代码如下所示

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output doctype-system="3B3_MS_R01_00_ShipmentStatusNotification.dtd" encoding="UTF-8"  indent="yes"/>
    <xsl:template match="/">
        <Pip3B3ShipmentStatusNotification>
            <fromRole>
                <PartnerRoleDescription>
                    <ContactInformation>
                        <contactName>
                        </contactName>
                    </ContactInformation>
                </PartnerRoleDescription>
            </fromRole>
        </Pip3B3ShipmentStatusNotification>
    </xsl:template>
</xsl:transform>

我在下面给出的宏,请检查宏,如果有任何问题请告诉我

Sub dummy()

    Call Transform("C:\Users\nypaul\Desktop\yves\out\source.xml", "C:\Users\nypaul\Desktop\yves\out\template\template.xsl", "C:\Users\nypaul\Desktop\yves\out\output.xml")

    MsgBox "ok"

End Sub

Function Transform(sourceFile, styleSheetFile, resultFile) As Boolean

    Dim Source As Object
    Dim StyleSheet As Object
    Dim Result As Object

    Set Source = CreateObject("MSXML2.DOMDocument")
    Set StyleSheet = CreateObject("MSXML2.DOMDocument")
    Set Result = CreateObject("MSXML2.DOMDocument")

    On Error GoTo TheEnd

    Transform = True
    Source.async = False
    Source.Load sourceFile

    StyleSheet.async = False
    StyleSheet.Load styleSheetFile
    Source.transformNodeToObject StyleSheet, Result
    Result.Save resultFile
    Exit Function

TheEnd:
    Transform = False

End Function

我如何理解错误是什么?

1 个答案:

答案 0 :(得分:0)

问题是当你做

Source.transformNodeToObject StyleSheet, Result
Result.Save resultFile

结果树的序列化由Result.Save操作完成,而不是由XSLT转换完成,因此在不知道xsl:output声明的情况下完成。这是因为Result是一个DOM Document对象,因此XSLT处理器只创建一个不涉及序列化的DOM。

我不是这个特定转换API的专家,但我认为如果你提供Stream作为transformNodeToObject的第二个参数,那么它应该可以工作。