我已经在此主题中找到了一些有关该主题的信息。但是我不相信这会很容易解决我的问题。
问题:
我有多个使用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><Text>@TEMPLATE_pic_data_AlarmHistory_PrintReport</Text></ExpPropValue>
</ExpProps_0>
</Elements_12>
我正在通过一些简短的代码片段对此进行更正:
<xsl:template match="text()[starts-with(.,'<Text>')]">
<Text>
<xsl:value-of select="substring-before(substring-after(., '<Text>'), '</Text>')"/>
</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,就像大多数(如果不是全部)编程语言一样,在执行任何代码之前已解决了导入。尝试传递变量是不可能的,因为当您的编译器正在寻找要导入的文档时,该变量不存在。因此,它将以字面意义为" $外部"。这可能是您问题的根源,也许值得研究。