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应用程序中编写它。。。而且该解决方案需要对技术性不强的人可读/可维护。