Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何删除不包含';Biztalk映射中没有任何子对象?_Xml_Mapping_Biztalk - Fatal编程技术网

Xml 如何删除不包含';Biztalk映射中没有任何子对象?

Xml 如何删除不包含';Biztalk映射中没有任何子对象?,xml,mapping,biztalk,Xml,Mapping,Biztalk,假设您有以下源数据,其中一个框和它的蛋糕之间有父子关系 <Box id = 1> <Cakes> <Cake id =1> <some other tags ...> </Cake> <Cake id =2> <some other tags ...> </Cake> </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),同时保持在图形映射器中正确映射蛋糕元素及其子标记的能力(因此不需要使用原始XSLT表达式来防止)


使用functoid是否有一种很好的方法来实现这一点?还是别的什么?

在映射方面,我有点一维,但我们总是使用映射器对XSLT进行原型化,然后将映射切换到使用自定义XSLT样式表

请参阅这些关于如何将映射转换为XSLT的文章

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

第一块蛋糕
第二块蛋糕
第四块蛋糕
第五块蛋糕

您可以测试当前
框的第一个子
蛋糕
id
属性是否返回空字符串


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

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

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

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

4) 插入不相等的functoid并连接到索引functoid(输出端)

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

6) 连接不相等输出到目标消息
节点

7) 插入值映射functoid

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

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

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



很抱歉,我现在无法提供屏幕截图;我希望您能从我的描述中理解。

谢谢,但我已经完成了很多可视化映射(该部分实际上非常复杂和深入,并且已经用可视化映射器完成并经过测试)。因此,在这种情况下,使用这样的自定义XSLT是不行的。我需要一个使用biztalk可视化映射器功能的解决方案。查看*.btm.cs文件的源代码,查看VS如何处理可视化映射;)我明白了,但这有点违背了使用Biztalk的目的,不是吗?如果我只想编写自定义XSLT,我可以直接在.NET应用程序中编写它。。。而且该解决方案需要对技术性不强的人可读/可维护。