想象一下,您拥有以下源数据,其中包含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有一个很好的方法吗?或其他什么?
答案 0 :(得分:2)
在映射方面,我有点像维度,但我们总是使用映射器来构建我们的XSLT,然后使用自定义XSLT样式表将地图切换为
请参阅这些有关如何将地图转换为XSLT的SO帖子Here和here
您的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
属性
抱歉,我现在无法提供截图;我希望你能从我的描述中找到答案。