Есть ли способ динамически назначить заголовок для управления XML ELEMENTS в XSLT - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь создать общий интерфейс, который преобразует 24 различных XML структуры в файлы Flate путем объединения элементов XML. В 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 значений элементов. Вот код, который мы попробовали.

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

Может кто-нибудь, пожалуйста, помогите мне, как передать эти динами c XML Элементы в Concat функционируют так, что они будут работать как XML Элементы и извлекать данные вместо печати того же самого строкового файла, как пример:

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

Заранее спасибо !! D C

1 Ответ

1 голос
/ 30 апреля 2020

Если ваша среда поддерживает XSLT 3 с Saxon PE или EE (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>&#10;</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>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

В качестве третьего варианта в XSLT 3 вы можете попробовать параметр stati c с атрибут тени:

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

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

Однако я не могу сказать, настроена ли ваша функция расширения в вашей среде для использования со параметрами stati c.

...