有没有办法在XSLT中动态地给XML ELEMENTS分配头。

问题描述 投票:0回答:1

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

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

我们把所有24个XML节点的名称都存储在表格行中。例:我们将变量名和XSLT的名称传递给XSLT。

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

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

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

当我们传递变量名并在Concat函数中使用时,它被当作一个字符串,只打印字符串而不是XML元素值。下面是我们尝试的代码。

<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>

该代码工作正常,下面的例子。

<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>

Can someone please help me out how to pass these dynamic XML Elements to Concat function so that it will work as XML Elements and retrieve the data instead of printing the same String file as example. Thanks in advance!!!

CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
..................

先谢谢你!!DC

xml xslt xslt-1.0 xslt-2.0 xslt-3.0
1个回答
1
投票

如果您的环境支持XSLT 3与Saxon PE或EE (https:/help.boomi.combundleintegrationpageint-XSLT_Stylesheet_Components_13300ba8-5e94-4b14-b6bd-5b90d7002233.html。 似乎说明了这一点)或使用撒克逊10号,其中的 xsl:evaluate 是所有版本都支持的,那么有一种方法是使用e.g.

<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>

请注意,我在param中只传递了字段名,并选择将分隔符的介绍委托给了 xsl:value-of. 不过,你也可以使用一个字符串,并插入任何分隔符,就像你的问题一样,然后把它传递给 xsl:evaluate:

<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中,作为第三种选择,你可以尝试使用带有影子属性的静态参数。

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

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

但是,我无法判断你的环境中的扩展函数是否被设置为可以使用静态参数。

© www.soinside.com 2019 - 2024. All rights reserved.