首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自定义XSLT标记

自定义XSLT标记
EN

Stack Overflow用户
提问于 2013-09-20 11:17:02
回答 1查看 444关注 0票数 0

我厌倦了写所有call-template/with-param的东西。

在以下示例中是否有此快捷方式:

代码语言:javascript
运行
复制
<xsl:call-template name="complexwidget">
     <xsl:with-param name="a" select="$bla_213"/>
     <xsl:with-param name="b" select="$bla_213"/>
     <xsl:with-param name="c" select="$bla_213"/>
     <xsl:with-param name="d" select="$bla_213"/>
</xsl:call-template>

一个完美的可能性是这样的:

<complex a="{$bla_213}" b="{$bla_213}" c="{$bla_213}" d="{$bla_213}" />

知道吗,也许是两次转换-xslt??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-20 11:37:33

如果您可以切换到XSLT2.0,那么用户函数就是您所需要的。

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:my="my-namespace">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <xsl:value-of select="my:complexWidget(1, 2, 3, 4)" />
    </xsl:template>

    <xsl:function name="my:complexWidget">
        <xsl:param name="a" />
        <xsl:param name="b" />
        <xsl:param name="c" />
        <xsl:param name="d" />
        <!-- Do something -->
        <xsl:value-of select="($a, $b,$c, $d)" separator="-" />
    </xsl:function>

</xsl:stylesheet>

在XSLT1.0中,我认为用另一种转换对xslt样式表进行预处理是唯一的方法(或者用您的处理器语言编写一些扩展函数)。

编辑:

我尝试了xslt的“预处理”,它似乎正在工作(但它可能不是最优雅的方法)。

输入xslt

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mypp="my-preprocess-namespace">
    <xsl:output method="text" />

    <xsl:template match="/">
        <xsl:variable name="varA" select="1"/>
        <xsl:variable name="varB" select="2"/>
        <xsl:variable name="varC" select="3"/>
        <xsl:variable name="varD" select="4"/>
        <mypp:complexWidget a="$varA" b="$varB" c="$varC" d="$varD"/>
    </xsl:template>

    <xsl:template name="complexWidget">
        <xsl:param name="a"/>
        <xsl:param name="b"/>
        <xsl:param name="c"/>
        <xsl:param name="d"/>
        <!-- do something-->
        <xsl:value-of select="$a"/>
        <xsl:text>-</xsl:text>
        <xsl:value-of select="$b"/>
        <xsl:text>-</xsl:text>
        <xsl:value-of select="$c"/>
        <xsl:text>-</xsl:text>
        <xsl:value-of select="$d"/>
    </xsl:template>
</xsl:stylesheet>

我在这里为要替换的元素(即xmlns:mypp="my-preprocess-namespace")定义了一个特殊的命名空间。要替换的元素是<mypp:complexWidget a="$varA" b="$varB" c="$varC" d="$varD"/>

这个xslt我用下面的xslt进行预处理。

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mypp="my-preprocess-namespace">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>


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

    <xsl:template match="mypp:*">
        <xsl:element name="xsl:call-template">
            <xsl:attribute name="name">
                <xsl:value-of select="local-name()" />
            </xsl:attribute>
            <xsl:for-each select="@*">
                <xsl:element name="xsl:with-param">
                    <xsl:attribute name="name">
                        <xsl:value-of select="name()" />
                    </xsl:attribute>
                    <xsl:attribute name="select">
                        <xsl:value-of select="." />
                    </xsl:attribute>
                </xsl:element>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

它基于“身份转换” -将所有内容复制到输出中--只是从特殊命名空间转换到调用模板元素的元素。我想这样做比我做得更好。

输出是

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:mypp="my-preprocess-namespace" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" />

    <xsl:template match="/">
        <xsl:variable name="varA" select="1"/>
        <xsl:variable name="varB" select="2"/>
        <xsl:variable name="varC" select="3"/>
        <xsl:variable name="varD" select="4"/>
        <xsl:call-template name="complexWidget">
            <xsl:with-param name="a" select="$varA"/>
            <xsl:with-param name="b" select="$varB"/>
            <xsl:with-param name="c" select="$varC"/>
            <xsl:with-param name="d" select="$varD"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="complexWidget">
        <xsl:param name="a"/>
        <xsl:param name="b"/>
        <xsl:param name="c"/>
        <xsl:param name="d"/>
        <!-- do something-->
        <xsl:value-of select="$a"/>
        <xsl:text>-</xsl:text>
        <xsl:value-of select="$b"/>
        <xsl:text>-</xsl:text>
        <xsl:value-of select="$c"/>
        <xsl:text>-</xsl:text>
        <xsl:value-of select="$d"/>
    </xsl:template>

</xsl:stylesheet>

当我以xslt样式表的形式运行输出时,它会产生预期的输出。

但是,对于通过另一个xslt生成xslt样式表,我没有更深层次的经验,所以我对这种方法可能遇到的问题不太了解。

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

https://stackoverflow.com/questions/18915433

复制
相关文章

相似问题

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