是否有一种方法可以在一个样式表中依次执行XSL变换



我已经在此主题中找到了一些有关该主题的信息。但是我不相信这会很容易解决我的问题。

问题:
我有多个使用XSLT 1.0的转换。
转换确实正确(使无效的XML有效),修改并加入三个不同的XML源。此外,对结果的XML节点进行了一些计算。

我很确定,我可以减少一些代码,但是目前,7个样式表产生了"人类易于理解的" XML文件,并具有良好的结果。

该过程基于Excel,我在其中通过VBA称为这些样式表。这起作用,但感觉很笨拙。

我正在寻找的是一个解决方案,它按顺序执行这些样式表。<xsl:include><xsl:import>对此不起作用,因为涉及的某些节点上有多种操纵,我需要保持代码至少可以阅读。

简而言之:
我正在寻找类似的东西,但是关于样式表中的碰撞模板:

<xsl:include href="$external"/>
<xsl:apply-templates select="document($path)"/>



有关评论的一些示例:
1。使无效的XML有效
XML源中有一些标签,这些标签无法正确设置,如以下示例所示。

<Elements_12 NODE="embedded object" TYPE="130">
  <ExpProps_0 NODE="embedded object">
    <Name>Text.Text</Name>
    <ExpPropValue>&lt;Text&gt;@TEMPLATE_pic_data_AlarmHistory_PrintReport&lt;/Text&gt;</ExpPropValue>
  </ExpProps_0>
</Elements_12>

我正在通过一些简短的代码片段对此进行更正:

<xsl:template match="text()[starts-with(.,'&lt;Text&gt;')]">
  <Text>
    <xsl:value-of select="substring-before(substring-after(., '&lt;Text&gt;'), '&lt;/Text&gt;')"/>
  </Text>
</xsl:template>


2。VBA中的电话:

' LOAD XML
xmlDoc.async = False
xmlDoc.Load strFileToOpen
' LOAD XSL
xslDoc.async = False
xslDoc.Load "element_stuff.xsl"
' TRANSFORM
xmlDoc.transformNodeToObject xslDoc, newDoc
newDoc.Save ActiveWorkbook.Path & "Output.xml"
' LOAD XML
xmlDoc.async = False
xmlDoc.Load ActiveWorkbook.Path & "Output.xml"
' LOAD XSL
xslDoc.async = False
xslDoc.Load "fetch_stuff.xsl"
' TRANSFORM
xmlDoc.transformNodeToObject xslDoc, newDoc
newDoc.Save ActiveWorkbook.Path & "Output.xml"

考虑通过每个XSLT脚本迭代的VBA循环,有条件地更改第一个调用:

Public Sub RunXSLs()
    Dim var As Variant
    Dim xmlDoc As MSXML2.DOMDocument, xslDoc As MSXML2.DOMDocument, newDoc As MSXML2.DOMDocument
    For Each var In Array("1.xsl", "2.xsl", "3.xsl", "4.xsl", "5.xsl", "6.xsl", "7.xsl")
        Set xmlDoc = New MSXML2.DOMDocument: Set xslDoc = New MSXML2.DOMDocument: Set newDoc = New MSXML2.DOMDocument
        ' LOAD XML
        xmlDoc.async = False
        If var = "1.xsl" Then
            xmlDoc.Load ActiveWorkbook.Path & "Input.xml"
        Else
            xmlDoc.Load ActiveWorkbook.Path & "Output.xml"
        End If
        ' LOAD XSL
        xslDoc.async = False
        xslDoc.Load ActiveWorkbook.Path & "" & var
        ' TRANSFORM
        xmlDoc.transformNodeToObject xslDoc, newDoc
        newDoc.Save ActiveWorkbook.Path & "Output.xml"
        Set xmlDoc = Nothing: Set xslDoc = Nothing: Set newDoc = Nothing
    Next var
End Sub

为什么<xsl:include><xsl:import>不起作用?据我们所知,从您的问题中说,它们是最明显的解决方案。

什么将有效

第一个脚本:

<xsl:import href="two.xslt"/>
<xsl:template match="/">
    <text>one</text>
    <xsl:call-template name="seq2"/>
</xsl:template>

第二个脚本:

<xsl:import href="three.xslt"/>
<xsl:template name="seq2">
    <text>two</text>
    <xsl:call-template name="seq3"/>
</xsl:template>

最后一个脚本:

<xsl:template name="seq3">
    <text>three</text>
</xsl:template>

什么永远无法工作

<xsl:include href="$external"/>

XSLT,就像大多数(如果不是全部)编程语言一样,在执行任何代码之前已解决了导入。尝试传递变量是不可能的,因为当您的编译器正在寻找要导入的文档时,该变量不存在。因此,它将以字面意义为" $外部"。这可能是您问题的根源,也许值得研究。

最新更新