有什么方法可以动态地将 header 分配给 con-cat XSLT 中的 XML 元素
Is there any way to dynamically assign header to con-cat the XML ELEMENTS in XSLT
我正在尝试构建一个通用接口,通过连接 XML 元素将 24 种不同的 XML 结构转换为 Flate 文件。在 Dell Boomi 中,我们可以选择将变量名动态传递给 XSLT。如下图:
<xsl:variable name="headers" select="boomi:get-ddp('DDP_Headers')"/>
我们已将所有 24 个 XML 节点名称存储在 table 行中。例如:
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,'
')" />
</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,'
')" />-->
<xsl:value-of
select="concat(CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT,'
')" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
有人可以帮我解决如何将这些动态 XML 元素传递给 Concat 函数,以便它可以作为 XML 元素并检索数据而不是像示例一样打印相同的字符串文件:
CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
..................
提前致谢!!
直流
如果您的环境支持带有 Saxon PE 或 EE 的 XSLT 3(https://help.boomi.com/bundle/integration/page/int-XSLT_Stylesheet_Components_13300ba8-5e94-4b14-b6bd-5b90d7002233.html 似乎暗示)或使用 Saxon 10,其中所有版本都支持 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:value-of separator=",">
<xsl:evaluate xpath="$fields" context-item="."/>
</xsl:value-of>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
请注意,我只在参数中传入了字段名称,并选择将分隔符介绍委托给 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> </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},'
')" />
但是,我不知道您的环境中的扩展函数是否设置为与静态参数一起使用。
我正在尝试构建一个通用接口,通过连接 XML 元素将 24 种不同的 XML 结构转换为 Flate 文件。在 Dell Boomi 中,我们可以选择将变量名动态传递给 XSLT。如下图:
<xsl:variable name="headers" select="boomi:get-ddp('DDP_Headers')"/>
我们已将所有 24 个 XML 节点名称存储在 table 行中。例如:
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,'
')" />
</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,'
')" />-->
<xsl:value-of
select="concat(CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT,'
')" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
有人可以帮我解决如何将这些动态 XML 元素传递给 Concat 函数,以便它可以作为 XML 元素并检索数据而不是像示例一样打印相同的字符串文件:
CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
CLIENTID,',',CLIENTNAME,',',CLIENTADDRESS,',',PAY,',',CLIENTLOCATION,',',XRFCODE,',',CLIENTCONTACT
..................
提前致谢!! 直流
如果您的环境支持带有 Saxon PE 或 EE 的 XSLT 3(https://help.boomi.com/bundle/integration/page/int-XSLT_Stylesheet_Components_13300ba8-5e94-4b14-b6bd-5b90d7002233.html 似乎暗示)或使用 Saxon 10,其中所有版本都支持 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:value-of separator=",">
<xsl:evaluate xpath="$fields" context-item="."/>
</xsl:value-of>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
请注意,我只在参数中传入了字段名称,并选择将分隔符介绍委托给 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> </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},'
')" />
但是,我不知道您的环境中的扩展函数是否设置为与静态参数一起使用。