Xslt XSL重用?对但是:元素不能包含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

我使用了大量重复转换的重样式表,因此我认为重用相同的代码块是明智的,这样我就不需要在许多不同的地方进行相同的更改。因此我发现,但是-唉-它不允许我这样做。当尝试在Sonic Workbench中运行它时,我得到以下错误:

每个元素的xsl:for不能包含xsl:import元素

这是我的样式表代码:

<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。我仍然不确定如何在我的情况下应用模板,因为它们似乎不存在