首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT -如何组合XSLT文件

XSLT -如何组合XSLT文件
EN

Stack Overflow用户
提问于 2012-09-09 13:38:54
回答 3查看 4.5K关注 0票数 3

有一个简单的结合XSLT的方法吗?我是XSLT新手,我掌握了如何创建XSLT的诀窍,以及如何使用它们来获得我想要的结果的有趣方法。然而,目前我能够使用一个XSLT将输出转换为所需的输出;但是,然后紧接着就有另一个,另一个。每个XSLT都会将输出从一件事情更改为另一件事。

例如,这些是简单的XSLT来说明这个问题:

XSLT 1:

代码语言:javascript
复制
<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>

然后:

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match=
        "*[not(@*|*|comment()|processing-instruction()) 
        and normalize-space()=''
        ]"/>
</xsl:stylesheet>

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

它是否就像将模板放在一个组合XSLT中的另一个下面一样简单?

XML SNIPT

代码语言:javascript
复制
<?xml version="1.0"?>
<root>
    <payload>
        <productId>11111</productId>
        <type>0</type>
        <url>https://11111</url>
    </payload>
    <payload>
        <productId>11111</productId>
        <type>1</type>
        <url>https://11111</url>
    </payload>
    <payload>
        <productId>11111</productId>
        <type>1</type>
        <url></url>
    </payload>
    <payload>
        <productId>22222</productId>
        <type>0</type>
        <url>https://22222</url>
    </payload>
    <payload>
        <productId>22222</productId>
        <type>1</type>
        <url>https://22222</url>
    </payload>
    <payload>
        <productId>22222</productId>
        <type>sw</type>
        <url>https://22222</url>
    </payload>
    <payload>
        <productId>22222</productId>
        <type>sw</type>
        <url></url>
    </payload>
</root>

这不是最好的例子,但它会奏效的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-09 13:43:22

答案是:,它取决于

如果您有多个XSL模板,那么就有可能将它们依次应用于XML --例如,如果您有3个XSLT的模板,那么第一个模板可能应用于原始文档,第二个模板应用于第一个转换的结果,第三个模板应用到第二个转换的结果。

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

如果XSLT是按顺序设计的,那么最好是这样--将它们混合到一个巨大的XSLT中是可能的,但是操作和维护非常困难,因为您必须将XML节点集从一个模板传递到另一个模板。这里讨论了这种方法,尽管我不同意作者的结论,即这是一种更纯粹的方法。

在上面的示例中,您有两个清晰的XSLT,第一个显然是结构化的--它旨在将XML响应的结构转换为另一个XML文档。您拥有的第二个XSLT几乎是一个实用XSLT --它的设计目的似乎是剔除任何不是属性或属性的内容。在这种情况下,最好将它们应用于XML响应消息。

票数 2
EN

Stack Overflow用户

发布于 2012-09-09 14:35:05

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

导入指令是这样的..。

代码语言:javascript
复制
<xsl:import href="my-other-transform.xsl" />

并且包含指令是相似的。

代码语言:javascript
复制
<xsl:include href="my-other-transform.xsl" />

导入引用其他样式表并使其模板可用,但其优先级低于主样式表的模板。xsl:include行为,就像指令被包含的样式表的逐字副本所取代一样。

一般来说,制作顶级样式表的首选技术是针对您试图解决的问题而设计的,而导入样式表则更具有通用性和通用性。

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

在XSLT3.0中,您可以使用xsl:package指令声明一个独立的模块集合,并对API点的可见性进行细粒度控制。

票数 1
EN

Stack Overflow用户

发布于 2012-09-09 14:56:18

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

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

作为组合不同变换的一般方法

使用<xsl:import>是你的朋友。

请看一下FXSL库,它包含超过150个样式表模块,其中许多模块导入其他模块。

经验法则

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12339548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档