gpt4 book ai didi

xml - XSLT 1.0 : IDOC to AdsML transformation

转载 作者:行者123 更新时间:2023-12-04 05:40:24 24 4
gpt4 key购买 nike

我需要将 SAP IDOC xml 转换为 AdsML 格式。
但抽象的问题是:如何将 xml1 转换为 xml2?

xml1:

<E1BPBUSISM008_ITEM_OUT>
<ITEM_NUMBER>010</ITEM_NUMBER>
</E1BPBUSISM008_ITEM_OUT>
<E1BPBUSISM008_ITEM_OUT>
<ITEM_NUMBER>020</ITEM_NUMBER>
</E1BPBUSISM008_ITEM_OUT>

<E1BPBUSISM008_AD_SPEC_AD_OU>
<ITEM_NUMBER>010</ITEM_NUMBER>
<PLANNED_WIDTH>1.851</PLANNED_WIDTH>
<PLANNED_HEIGHT>0.000</PLANNED_HEIGHT>
</E1BPBUSISM008_AD_SPEC_AD_OU>
<E1BPBUSISM008_AD_SPEC_AD_OU>
<ITEM_NUMBER>020</ITEM_NUMBER>
<PLANNED_WIDTH>2.37</PLANNED_WIDTH>
<PLANNED_HEIGHT>0.000</PLANNED_HEIGHT>
</E1BPBUSISM008_AD_SPEC_AD_OU>

进入xml2:
<Ad>
<ad-number>010<ad-number>
<width>1.851</width>
<height>0.000</height>
</Ad>
<Ad>
<ad-number>020<ad-number>
<width>2.37</width>
<height>0.000</height>
</Ad>

我在这里尝试的是 Muench 方法,但即使它是这种情况的正确解决方案,也不知道如何完成它,因为它返回错误的“宽度”和“高度”(所有广告元素都相同):
<xsl:key name="adnumbers" match="IE1BPBUSISM008_ITEM_OUT" use="ITEM_NUMBER"/>
....
<xsl:for-each select="E1BPBUSISM008_ITEM_OUT[generate-id(.)=generate-id(key('adnumbers',ITEM_NUMBER)[1])]">
<xsl:sort select="ITEM_NUMBER"/>
<Ad>
<ad-number>
<xsl:value-of select="ITEM_NUMBER/text()"/>
</ad-number>
<width>
<xsl:value-of select="E1BPBUSISM008_AD_SPEC_AD_OU/PLANNED_WIDTH"/>
</width>
<height>
<xsl:value-of select="E1BPBUSISM008_AD_SPEC_AD_OU/PLANNED_HEIGHT"/>
</height>

输出:
<Ad>
<number>010</ad-number>
<width>1.851</width>
<heigth>0.000</heigth>
</Ad>
<Ad>
<number>020</ad-number>
<width>1.851</width>
<heigth>0.000</heigth>
</Ad>

最佳答案

您不需要实际的 Muenchian 分组 - 使用 key 就足以获得所需的结果。

<xsl:key name="k_AD_SPEC_AD_OU" match="E1BPBUSISM008_AD_SPEC_AD_OU" use="ITEM_NUMBER" />

<!-- ... -->

<xsl:for-each select="E1BPBUSISM008_ITEM_OUT">
<xsl:sort select="ITEM_NUMBER" />
<Ad>
<ad-number>
<xsl:value-of select="ITEM_NUMBER" />
</ad-number>
<width>
<xsl:value-of select="key('k_AD_SPEC_AD_OU', ITEM_NUMBER)[1]/PLANNED_WIDTH" />
</width>
<height>
<xsl:value-of select="key('k_AD_SPEC_AD_OU', ITEM_NUMBER)[1]/PLANNED_HEIGHT" />
</height>
</Ad>
</xsl:for-each>

<!-- ... -->

然而,正确的解决方案取决于您的 E1BPBUSISM008_ITEM_OUT 之间的关系。和 E1BPBUSISM008_AD_SPEC_AD_OU :您的示例表明它只是 1 对 1 这将使 key 变得不必要,但我怀疑您的实际关系可能是 1 到 0 或 1 甚至 1 到 0 或更多 .

如果您需要为丢失的 E1BPBUSISM008_AD_SPEC_AD_OU 创建输出元素(1 到 0 或 1 关系)xslt 需要一些调整。

对于一个简单的 1 对 1 您的 xslt 可能如下所示:
<!-- ... -->

<xsl:for-each select="E1BPBUSISM008_ITEM_OUT">
<xsl:sort select="ITEM_NUMBER" />
<Ad>
<ad-number>
<xsl:value-of select="ITEM_NUMBER" />
</ad-number>

<xsl:call-template name="AD_SPEC_AD_OU">
<xsl:with-param name="pITEM_NUMBER" select="ITEM_NUMBER" />
</xsl:call-template>
</Ad>
</xsl:for-each>

<xsl:template name="AD_SPEC_AD_OU">
<xsl:param name="pITEM_NUMBER" />

<width>
<xsl:value-of select="//E1BPBUSISM008_AD_SPEC_AD_OU[ITEM_NUMBER = $pITEM_NUMBER]/PLANNED_WIDTH" />
</width>
<height>
<xsl:value-of select="//E1BPBUSISM008_AD_SPEC_AD_OU[ITEM_NUMBER = $pITEM_NUMBER]/PLANNED_HEIGHT" />
</height>
</xsl:template>

关于xml - XSLT 1.0 : IDOC to AdsML transformation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11325531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com