Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT-如何组合XSLT文件_Xml_Xslt - Fatal编程技术网

Xml XSLT-如何组合XSLT文件

Xml XSLT-如何组合XSLT文件,xml,xslt,Xml,Xslt,有没有一种简单的组合XSLT的方法。我是XSLT新手,我掌握了如何创建XSLT的窍门,以及使用XSLT获得所需结果的有趣方法。然而,目前我能够使用一个XSLT将我的输出转换成所需的输出但是紧接着我又有了一个,还有一个。每个XSLT都会将输出从一件事更改为另一件事 例如,以下是简单的XSLT来说明问题: XSLT 1: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmln

有没有一种简单的组合XSLT的方法。我是XSLT新手,我掌握了如何创建XSLT的窍门,以及使用XSLT获得所需结果的有趣方法。然而,目前我能够使用一个XSLT将我的输出转换成所需的输出但是紧接着我又有了一个,还有一个。每个XSLT都会将输出从一件事更改为另一件事

例如,以下是简单的XSLT来说明问题:

XSLT 1:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:r="http://www.castiron.com/response" exclude-result-prefixes="r">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/root">
        <xsl:element name="imageScene7Response"  xmlns="http://www.castiron.com/burberry/digitalcatalogue/response">
            <xsl:element name="rcode">0</xsl:element>
            <xsl:element name="rmessage">success</xsl:element>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="payload"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="/root/payload">
        <xsl:if test="not(productId = preceding-sibling::payload/productId)">

            <xsl:element name="payload" xmlns="http://www.castiron.com/burberry/digitalcatalogue/response">
                <xsl:element name="productId">
                    <xsl:value-of select="productId"/>
                </xsl:element>
                <xsl:for-each select="../payload[productId = current()/productId]">
                    <xsl:choose>
                        <xsl:when test="type = '0' and preceding-sibling::payload/type = type and productId = preceding-sibling::payload/productId">
                            <xsl:element name="alternativeImages">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="type = '0'">
                            <xsl:element name="mainImage">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="type &gt; '0' and type &lt; '70'">
                            <xsl:element name="alternativeImages">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="type = '70'">
                            <xsl:element name="video">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="type = '80'">
                            <xsl:element name="lookbookImages">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="type = 'sw'">
                            <xsl:element name="swatchImages">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                    </xsl:choose>
                </xsl:for-each>
            </xsl:element>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

0
成功
然后:


然后是其他XSLT中的其他逻辑

它是否像将模板放在一个组合XSLT中一样简单

XML SNIPT


11111
0
https://11111
11111
1.
https://11111
11111
1.
22222
0
https://22222
22222
1.
https://22222
22222
西南
https://22222
22222
西南

这不是最好的例子,但它会起作用

答案是:视情况而定

如果您有多个XSL模板,那么它们可能是按顺序应用于XML的——例如,如果您有3个XSLT,那么第一个模板可能应用于原始文档,第二个模板应用于第一次转换的结果,第三个模板应用于第二次转换的结果

这被称为-XML沿着XSLT管道流动,被反复转换,直到结果从另一端出来,这是一种非常有效的方法

如果XSLT的设计是按顺序应用的,那么最好保持这种方式——将它们混合到一个巨大的XSLT中是可能的,但操作和维护起来可能非常棘手,因为您必须将XML节点集从一个模板传递到另一个模板。虽然我不同意作者的结论,即这是一种更纯粹的方法,但我们讨论了这种方法


在上面的示例中,您有两个清晰的XSLT。第一个显然是结构化的——它旨在将XML响应的结构转换为另一个XML文档。您拥有的第二个XSLT几乎是一个实用的XSLT——它似乎被设计为去掉任何不是属性或属性的东西。在本例中,最好将它们应用于XML响应消息。

在XSLT1.0和2.0中,有两种用于组合样式表的本机说明:xsl:import和xsl:include。在XSLT3.0中,还有第三种机制,我将在后面介绍

导入指令如下所示

<xsl:import href="my-other-transform.xsl" />

include指令也类似

<xsl:include href="my-other-transform.xsl" />

xsl:import引用其他样式表并使其模板可用,但优先级低于主样式表的模板。include的作用就像指令被包含的样式表的逐字副本替换一样

一般来说,制作顶级样式表(针对您试图解决的问题)和导入样式表(其中导入的样式表更通用)的首选技术

如果您在客户端使用XSLT1.0,我不知道,但我怀疑浏览器对xsl:import和xsl:include的支持将受到限制。如果您使用的是XSLT1.0服务器端,那么您就太丢脸了!您没有理由不升级到XSLT2.0


在XSLT 3.0中,您可以使用xsl:package指令声明一个自包含的模块集合,并对API点的可见性进行细粒度控制。

可以改进第一个转换,以便甚至可以消除第二个转换

一旦OP编辑了这个问题并提供了一个源XML文档,我很乐意更新这个答案

关于组合不同转换的一般方法

使用
是你的朋友

请务必查看库,其中包含150多个样式表模块,其中许多模块导入了其他模块

经验法则


当同一样式表模块中包含的一个模板或一组模板包含可在多种情况下使用的有用功能时,最好以这样的方式编写这些模板,以便于其他更具体的样式表模块导入它们,需要此功能,从而避免在每个不同的特定情况下重新实现此功能。

非常感谢您是我要找的这一点
如果您有多个XSL模板,那么它可能是
<xsl:import href="my-other-transform.xsl" />
<xsl:include href="my-other-transform.xsl" />