我已经在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><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"
答案 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