包含多个类似的XSLT文件,不会发生冲突或覆盖模板

时间:2015-08-02 11:52:36

标签: xml xslt include

我试图设计一种在XSLT文件中存储数据的方法,然后使用XSLT处理它们以在最后生成XML文件。这些是我的两个源XSLT文件,以及我追求的结果:

文件1:

<fruit>
    <xsl:variable name="amount">10</xsl:variable>
    <type>apple</type>
    <quantity><xsl:value-of select="$amount"/></quantity>
    <remaining><xsl:value-of select="$amount / 2"/></remaining>
</fruit>

文件2:

<fruit>
    <xsl:variable name="amount">20</xsl:variable>
    <type>banana</type>
    <quantity><xsl:value-of select="$amount"/></quantity>
    <remaining><xsl:value-of select="$amount / 2"/></remaining>
</fruit>

输出:

Fruit: apple 5/10
Fruit: banana 10/20

编写XSLT代码以获取单个XML文件并生成我想要的输出没有问题,但我仍然坚持如何将这两个文件组合在一起。如果我使用<xsl:include>,那么我需要将文件包装在<xsl:template>个元素中,这很好,但是我会有多个相同的模板,所以我会得到一个错误,或者{ {1}}其中一个将被另一个覆盖。

我最终希望将此扩展到两个以上的文件,而不必将我的XSLT代码更改为包含/导入行,因此它不会为每个模板提供自定义名称,因为我希望我的全局XSLT能够将变换应用于所有<xsl:import>元素,而无需手动指定每个模板名称。

有没有办法实现这个目标?

编辑:显然我的简化示例再次过于简单,评论似乎在问我为什么会这样做。所以,这是具有不同名称的相同示例,使其更具体而不是一般性问题。而不是<fruit>尝试这个。 (我仍在设计XML,因此我无法发布我的&#34;真正的代码,因为我还没有设计它,因为在我解决这个问题之前我无法这样做问题)。

main.xsl:

<fruit>

one.xsl:

...
<xsl:variable name="root">/srv</xsl:variable>
<xsl:variable name="baseport">80</xsl:variable>
...
<!-- I don't know how to make this work, as the two (or more) XSL files
     have the same root element -->
<xsl:include href="one.xsl"/>
<xsl:include href="two.xsl"/>
...

two.xsl

...
<file name="one.dat">
    <path><xsl:value-of select="$root">/data</path>
    <backup-path><xsl:value-of select="$root">/data.bak</backup-path>
    <port><xsl:value-of select="$baseport + 1"/></port>
</file>
...

这将产生类似的东西:

...
<file name="two.dat">
    <path>/var/log</path>
    <backup-path><xsl:value-of select="$root">/backup/var/log</backup-path>
    <port><xsl:value-of select="$baseport + 2"/></port>
</file>
...

产生<content for="one.dat"> path = /srv/data backup-path = /srv/data.bak port = 81 </content> <content for="two.dat"> path = /var/log backup-path = /srv/backup/var/log port = 82 </content> 结构的XSLT代码应被视为&#34;代码&#34; (我的应用程序的一部分)但包含<content>元素的XSLT代码是&#34;数据&#34; (由我的应用程序的用户提供。)这就是为什么我要保留我的代码&#34;与他们的数据&#34;分开。

我的代码将首先处理一个用户文件(<file>),方法是输入一个空文档,以生成包含许多main.xsl元素的XML文档,以便进一步转换。然后,我可以将该XML提供给我的应用程序的XSLT代码,以生成所需的输出。

如果<file>中列出了所有<file>元素,那么这不是问题,我可以将其处理为XML(包含多个main.xsl元素)然后使用<file>来浏览每个<xsl:for-each>

当用户想要将代码分成多个文件时,问题就出现了,每个文件中都有一个<file>个元素。他们不能再使用<file>将它们重新组合在一起,正如我上面的例子所示。

换句话说,我无法了解如何构建<xsl:include>以使其包含main.xslone.xsl,同时保持two.xsl个元素不变。看起来使用命名模板是唯一的方法,但这增加了我想要避免的额外冗余级别。

0 个答案:

没有答案