Xslt XSL重用?对但是:元素不能包含xsl:import元素!:-(
我使用了大量重复转换的重样式表,因此我认为重用相同的代码块是明智的,这样我就不需要在许多不同的地方进行相同的更改。因此我发现,但是-唉-它不允许我这样做。当尝试在Sonic Workbench中运行它时,我得到以下错误: 每个元素的xsl:for不能包含xsl:import元素 这是我的样式表代码:Xslt XSL重用?对但是:元素不能包含xsl:import元素!:-(,xslt,import,code-reuse,Xslt,Import,Code Reuse,我使用了大量重复转换的重样式表,因此我认为重用相同的代码块是明智的,这样我就不需要在许多不同的地方进行相同的更改。因此我发现,但是-唉-它不允许我这样做。当尝试在Sonic Workbench中运行它时,我得到以下错误: 每个元素的xsl:for不能包含xsl:import元素 这是我的样式表代码: <xsl:template match="/"> <InboundFargoMessage> <EdiSender> <xsl:value
<xsl:template match="/">
<InboundFargoMessage>
<EdiSender>
<xsl:value-of select="TransportInformationMessage/SenderId"/>
</EdiSender>
<EdiReceiver>
<xsl:value-of select="TransportInformationMessage/RecipientId"/>
</EdiReceiver>
<EdiSource>PORLOGIS</EdiSource>
<EdiDestination>FARGO</EdiDestination>
<Transportations>
<xsl:for-each select="TransportInformationMessage/TransportUnits/TransportUnit">
<xsl:import href="TransportCDMtoFDM_V0.6.xsl"/>
</xsl:for-each>
<xsl:for-each select="TransportInformationMessage/Waybill/TransportUnits/TransportUnit">
<xsl:import href="TransportCDMtoFDM_V0.6.xsl"/>
</xsl:for-each>
</Transportations>
</InboundFargoMessage>
</xsl:template>
</xsl:stylesheet>
波洛吉斯
法戈
现在我将省略子xsl表,因为问题似乎发生在底层
如果我不能使用xsl:import,是否有重用的选项?包含的每个xsl文件都应该包含一个模板
主文件在开头包含其他文件,然后使用
calltemplate
或apply templates
从不同位置调用模板。包含的每个XSL文件都应包含一个模板
主文件在开头包含其他文件,然后使用calltemplate
或apply templates
从不同的位置调用模板
如果我不能使用xsl:import,有吗
有重用的选择吗
您可以使用
所有
元素必须是
另一种选择是,必须全局定义
元素(
的子元素),但可以在前面加上任何其他可以全局放置的xslt指令
您需要了解并充分理解使用这两条XSLT指令的规则。我建议您阅读一本关于XSLT的好书
XSLT中可重用性的主要单元是模板(
)
导入样式表可以使用(通过
或
)任何导入样式表中定义的任何模板
如果我不能使用xsl:import,有吗
有重用的选择吗
您可以使用
所有
元素必须是
另一种选择是,必须全局定义
元素(
的子元素),但可以在前面加上任何其他可以全局放置的xslt指令
您需要了解并充分理解使用这两条XSLT指令的规则。我建议您阅读一本关于XSLT的好书
XSLT中可重用性的主要单元是模板(
)
导入样式表可以使用(通过
或
)在任何导入的样式表中定义的任何模板。感谢所有的建议,这些建议有些帮助,但请允许我给出一个完整的答案。正如所建议的,重用问题的答案在于xsl:templates。模板可以通过将其封装在中来定义。然后,在必要时,可以通过添加元素。此外,它们可以放入单独的xsl表中,只要它们是在父xsl表的顶部导入的
因此,我的问题的解决办法如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:far="http://www.itella.com/fargo/fargogate/" xmlns:a="http://tempuri.org/XMLSchema.xsd" xmlns:p="http://tempuri.org/XMLSchema.xsd">
<xsl:import href="TransportCDMtoFDM_V0.6.xsl"/>
<xsl:template match="/">
<InboundFargoMessage>
<EdiSender>
<xsl:value-of select="TransportInformationMessage/SenderId"/>
</EdiSender>
<EdiReceiver>
<xsl:value-of select="TransportInformationMessage/RecipientId"/>
</EdiReceiver>
<EdiSource>PORLOGIS</EdiSource>
<EdiDestination>FARGO</EdiDestination>
<Transportations>
<xsl:for-each select="TransportInformationMessage/TransportUnits/TransportUnit">
<xsl:call-template name="transport"/>
</xsl:for-each>
<xsl:for-each select="TransportInformationMessage/Waybill/TransportUnits/TransportUnit">
<xsl:call-template name="transport"/>
</xsl:for-each>
</Transportations>
</InboundFargoMessage>
</xsl:template>
波洛吉斯
法戈
其中文件“TransportCDMtoFDM_V0.6.xsl”包含名为“transport”的模板
只剩下一个问题:使用模板时,模板中提到的所有节点都会被使用,即使它们是空的。因此,剩下的问题是如何删除空节点?感谢所有的建议,这些建议有些帮助,但请允许我制定一个完整的答案。正如建议的那样,关于re的问题的答案是-用法存在于xsl:templates中。可以通过将模板封装在其中来定义模板。然后,在必要时,可以通过添加元素来调用模板。此外,可以将模板放入单独的xsl表中,只要将其导入父xsl表的顶部即可 因此,我的问题的解决办法如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:far="http://www.itella.com/fargo/fargogate/" xmlns:a="http://tempuri.org/XMLSchema.xsd" xmlns:p="http://tempuri.org/XMLSchema.xsd">
<xsl:import href="TransportCDMtoFDM_V0.6.xsl"/>
<xsl:template match="/">
<InboundFargoMessage>
<EdiSender>
<xsl:value-of select="TransportInformationMessage/SenderId"/>
</EdiSender>
<EdiReceiver>
<xsl:value-of select="TransportInformationMessage/RecipientId"/>
</EdiReceiver>
<EdiSource>PORLOGIS</EdiSource>
<EdiDestination>FARGO</EdiDestination>
<Transportations>
<xsl:for-each select="TransportInformationMessage/TransportUnits/TransportUnit">
<xsl:call-template name="transport"/>
</xsl:for-each>
<xsl:for-each select="TransportInformationMessage/Waybill/TransportUnits/TransportUnit">
<xsl:call-template name="transport"/>
</xsl:for-each>
</Transportations>
</InboundFargoMessage>
</xsl:template>
波洛吉斯
法戈
其中文件“TransportCDMtoFDM_V0.6.xsl”包含名为“transport”的模板
只剩下一个问题:使用模板时,模板中提到的所有节点都会被使用,即使它们是空的。所以剩下的问题是如何省略空节点?仔细研究后,我根本不能使用import,因为它应该位于样式表的顶部,类似于Java的import语句和C#的using-语句。那么问题是我还可以使用什么?经过进一步调查,我根本不能使用import,因为它应该位于我的样式表顶部,并且类似于Java的import语句和C#的using语句。那么问题是我还可以使用什么?Thnx。我仍然不确定如何在我的案例中应用模板,因为它们似乎需要匹配,然而,我只需要在基本xsl表的某些节点上调用一段xsl代码。另外:如果我在同一个样式表中定义模板,那么我就不需要任何导入语句了吗?@Fedor Steeman:你需要读一本关于XSLT的好书。当有人不懂C,但想用C编写程序时也是如此。好的,我会向我的老板要一本关于XSLT的好书在我解决这个问题后,还是自己去买一本好书。现在我只需要尽快解决这个问题,而且我已经非常接近了。我现在唯一需要的是如何省去空元素。好的:Thnx。我仍然不确定如何在我的情况下应用模板,因为它们似乎不存在