有没有办法在一个样式表中顺序执行XSL转换?

时间:2017-03-13 14:07:17

标签: xml xslt xslt-1.0

我已经在this帖子中找到了有关该主题的一些信息。但我不相信这会轻易解决我的问题。

问题:
我有多个转换,使用XSLT 1.0 转换确实正确(使XML无效),修改和连接三个不同的XML源。此外,还对生成的XML节点进行了一些计算。

我很确定,我可以减少一些代码,但目前7个样式表产生了#34;人类可以理解的#34; 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"

2 个答案:

答案 0 :(得分:1)

为什么<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与大多数(如果不是全部)编程语言一样,在执行任何代码之前已经解析了导入。尝试传递变量是不可能的,因为当编译器查找要导入的文档时,该变量不存在。因此,文字路径将是“$ external”。这可能是您的问题的根源,可能值得研究。

答案 1 :(得分:1)

考虑一个VBA循环来迭代每个XSLT脚本,有条件地改变第一个调用:

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