首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在XSLT中动态分配报头来对XML元素进行分类

有没有办法在XSLT中动态分配报头来对XML元素进行分类
EN

Stack Overflow用户
提问于 2020-04-30 19:20:22
回答 1查看 107关注 0票数 0

我正在尝试构建一个通用接口,通过连接XML元素将24种不同的XML结构转换为Flate Files。在Dell Boomi中,我们可以选择将变量名动态传递给XSLT。如下图所示:

<xsl:variable name="headers" select="boomi:get-ddp('DDP_Headers')"/>

我们已经在表行中存储了所有24个XML节点名。例如:

CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',....,',',CLIENTCONTACT

PERSONID,',',PERSONNAME,',',PERSONADDRESS,',',....,',',PERSONCONTACT

......,',',.......,',',... etc

当我们传递变量名并在Concat函数中使用它时,它将作为字符串,并且只打印字符串,而不打印XML元素值。这是我们尝试过的代码。

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:boomi="http://boomi.com/custom-function">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:variable name="headers" select="boomi:get-ddp('DDP_Headers')"/>
  <xsl:template match="/">
        <xsl:for-each select="//externalKPIClientProductivity">
    <xsl:value-of select="concat($headers,'&#xA;')" />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

代码在下面的示例中运行良好:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:boomi="http://boomi.com/custom-function">
  <xsl:output method="text" encoding="utf-8" />

  <xsl:variable name="headers" select="boomi:get-ddp('DDP_Headers')"/>
  <xsl:template match="/">
        <xsl:for-each select="//externalKPIClientProductivity">
            <!-- <xsl:value-of select="@id" />  -->
    <!--<xsl:value-of
                select="concat($headers,'&#xA;')" />-->
                <xsl:value-of
                select="concat(CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT,'&#xA;')" /> 
        </xsl:for-each>
    </xsl:template>


</xsl:stylesheet>

有没有人能告诉我如何将这些动态XML元素传递给Concat函数,这样它就可以像XML元素一样工作并检索数据,而不是像示例那样打印相同的字符串文件:

代码语言:javascript
复制
CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
..................

提前感谢!!数据中心

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-30 20:16:17

如果您的环境支持带有Saxon PE或EE的XSLT3 (https://help.boomi.com/bundle/integration/page/int-XSLT_Stylesheet_Components_13300ba8-5e94-4b14-b6bd-5b90d7002233.html似乎建议这样做),或者使用所有版本都支持xsl:evaluate的Saxon10,那么一种方法是使用例如

代码语言:javascript
复制
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all" version="3.0">

    <xsl:param name="fields" as="xs:string">foo,bar,baz</xsl:param>

    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:for-each select="//item">
            <xsl:value-of separator=",">
                <xsl:evaluate xpath="$fields" context-item="."/>
            </xsl:value-of>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

请注意,我只传入了参数中的字段名,并选择将分隔符介绍委托给xsl:value-of。但是,您也可以使用带有任何分隔符的字符串,将其传递给xsl:evaluate

代码语言:javascript
复制
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all" version="3.0">

    <xsl:param name="fields" as="xs:string">foo,',',bar,',',baz</xsl:param>

    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:for-each select="//item">
            <xsl:evaluate xpath="$fields" context-item="."/>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

作为XSLT 3中的第三种选择,您可以尝试使用带有shadow属性的静态参数:

代码语言:javascript
复制
<xsl:variable name="headers" static="yes" select="boomi:get-ddp('DDP_Headers')"/>

<xsl:value-of _select="concat({$headers},'&#xA;')" />

但是,我不知道您的环境中的扩展函数是否设置为与静态参数一起使用。

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

https://stackoverflow.com/questions/61522179

复制
相关文章

相似问题

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