如何删除Biztalk Map中没有任何子项的父记录?

时间:2011-01-24 07:44:12

标签: xml mapping biztalk

想象一下,您拥有以下源数据,其中包含Box与其Cakes之间的父子关系。

<Box id = 1>
   <Cakes>
    <Cake id =1>
            <some other tags ...>
    </Cake>
    <Cake id =2>
            <some other tags ...>
    </Cake>
   </Cakes>   
</Box>
<Box id = 2>    
    <Cakes/>   
</Box>

目标是正确删除目标中不包含蛋糕的盒子(例如方框2),同时保持在图形映射器中正确映射Cake元素及其子标签的能力(因此不使用原始XSLT表达会阻止这种情况。)

使用functoid有一个很好的方法吗?或其他什么?

2 个答案:

答案 0 :(得分:2)

在映射方面,我有点像维度,但我们总是使用映射器来构建我们的XSLT,然后使用自定义XSLT样式表将地图切换为

请参阅这些有关如何将地图转换为XSLT的SO帖子Herehere

您的XSLT看起来像

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:msxsl="urn:schemas-microsoft-com:xslt"
        xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
        exclude-result-prefixes="msxsl var userCSharp"
        version="1.0"
        xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp">

    <xsl:output
        omit-xml-declaration="no"
        method="xml"
        version="1.0"
        encoding="UTF-8" />

    <xsl:template match="/">
        <xsl:apply-templates select="Boxes" />
    </xsl:template>
    <xsl:template match="Boxes">
        <MappedBoxes>
            <xsl:for-each select="Box[count(Cakes/Cake) > 0]">
                <MappedBox>
                    <MappedCakes>
                        <xsl:for-each select="Cakes/Cake">
                            <MappedCake>
                                <xsl:value-of select="Tag/text()" />
                            </MappedCake>
                        </xsl:for-each>
                    </MappedCakes>
                </MappedBox>
            </xsl:for-each>
        </MappedBoxes>
    </xsl:template>
</xsl:stylesheet>

这是我使用的XML

<Boxes>
    <Box id = "1">
        <Cakes>
            <Cake id ="1">
                <Tag>FirstCake</Tag>
            </Cake>
            <Cake id ="2">
                <Tag>SecondCake</Tag>
            </Cake>
        </Cakes>
    </Box>
    <Box id = "2">
        <Cakes/>
    </Box>
    <Box id = "3">
    </Box>
    <Box id = "4">
        <Cakes>
            <Cake id ="4">
                <Tag>FourthCake</Tag>
            </Cake>
            <Cake id ="5">
                <Tag>FifthCake</Tag>
            </Cake>
        </Cakes>
    </Box>
</Boxes>

答案 1 :(得分:2)

您可以测试当前id的第一个Cake子项的Box属性是否返回空字符串。


使用以下functoid获得所需的转换:

1)插入迭代 functoid并连接到Box节点

2)插入索引 functoid并连接到id节点的Cake属性

3)将索引 functoid连接到迭代 functoid(输出端)

4)插入 Not Equal functoid并连接到索引 functoid(输出端)

5)配置不等于功能输入;添加空字符串常量

6)将 Not Equal 输出连接到目标消息Box节点

7)插入值映射 functoid

8)将不等于输出连接到值映射输入端

9)将源消息id节点的Box属性连接到值映射输入

10)将值映射输出连接到目标消息id节点的Box属性


抱歉,我现在无法提供截图;我希望你能从我的描述中找到答案。