提取每个子节点以创建 XML 与父节点
extract each child node to create XML with parent nodes
我有如下输入XML。我需要提取每个子节点 <DETS>
并通过将其与其公共父节点合并来创建一个新的 XML。
输入:
<STDS>
<DEPT>ABC</DEPT>
<COD>123</COD>
<PIN>456</PIN>
<DETS>
<NAM>XYZ</NAM>
<AGE>21</AGE>
</DETS>
<DETS>
<NAM>KLM</NAM>
<AGE>22</AGE>
</DETS>
</STDS>
I need the output like following.
输出:
<Students>
<Department>ABC</Department>
<Code>123</Code>
<Pin>456</Pin>
<Details>
<Name>XYZ</Name>
<Age>21</Age>
</Details>
</Students>
<Students>
<Department>ABC</Department>
<Code>123</Code>
<Pin>456</Pin>
<Details>
<Name>KLM</Name>
<Age>22</Age>
</Details>
</Students>
我已经尝试过使用 for-each 但我做不到。
这是我正在尝试的代码。如果我将 for-each 保留在 <students>
中,它将为 <students>
中的每个子项创建新的 XML。如果我在外部使用 for-each XML,如何在范围之外访问 <Students>
的元素。
<?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 s0 userCSharp" version="1.0" xmlns:ns0="Students" xmlns:s0="STDS" xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:template match="/">
<xsl:apply-templates select="/s0:STDS" />
</xsl:template>
<xsl:template match="/s0:STDS">
<ns0:Students>
<xsl:for-each select="s0:STDS">
<xsl:variable name="var:v1" select="s0:DEPT" />
<Department>
<xsl:value-of select="$var:v1" />
</Department>
<xsl:variable name="var:v2" select="s0:COD" />
<Code>
<xsl:value-of select="$var:v2" />
</Code>
<xsl:variable name="var:v3" select="s0:PIN)" />
<Pin>
<xsl:value-of select="$var:v3" />
</Pin>
<xsl:for-each select="s0:STDS/s0:DETS">
<ns0:Details>
<xsl:variable name="var:v4" select="s0:DETS/s0:NAM" />
<Name>
<xsl:value-of select="$var:v4" />
</Name>
<xsl:variable name="var:v5" select="s0:DETS/s0:AGE" />
<Age>
<xsl:value-of select="$var:v5" />
</Age>
<ns0:Details>
</xsl:for-each>
</xsl:for-each>
<ns0:Students>
</xsl:template>
../
功能可用于遍历从子上下文到父上下文的 XML 级别。
以下是您可以使用的 XSL 模板。请注意,输入 XML shared 没有声明任何命名空间,因此在下面的解决方案中没有命名空间的引用。这应该会给你想要的输出。
<xsl:template match="/">
<xsl:for-each select="STDS/DETS">
<Students>
<Department><xsl:value-of select="../DEPT" /></Department>
<Code><xsl:value-of select="../COD" /></Code>
<Pin><xsl:value-of select="../PIN" /></Pin>
<Details>
<Name><xsl:value-of select="NAM" /></Name>
<Age><xsl:value-of select="AGE" /></Age>
</Details>
</Students>
</xsl:for-each>
</xsl:template>
问题被标记为 BizTalk。这是正确的 BizTalk 答案。
在 Mapper 中,您需要做的就是通过 Looping Functoid.
将 <DETS>
连接到 <Students>
就是这样,不需要自定义 xslt。是的,就这么简单。
__
无法编辑答案,因为两个不同问题的答案相同。这是 BizTalk 特定的 情况。问题被标记为 BizTalk。虽然它们在技术上可能是正确的,但 Xsl 答案并不是在 BizTalk.
中执行此操作的正确方法
删除此答案只会删除正确的 BizTalk 域特定 答案。如果再次删除此答案,好吧,我会放弃,OP 可能会遇到 不必要的复杂和错误的 (对于 BizTalk)解决方案。
我有如下输入XML。我需要提取每个子节点 <DETS>
并通过将其与其公共父节点合并来创建一个新的 XML。
输入:
<STDS>
<DEPT>ABC</DEPT>
<COD>123</COD>
<PIN>456</PIN>
<DETS>
<NAM>XYZ</NAM>
<AGE>21</AGE>
</DETS>
<DETS>
<NAM>KLM</NAM>
<AGE>22</AGE>
</DETS>
</STDS>
I need the output like following.
输出:
<Students>
<Department>ABC</Department>
<Code>123</Code>
<Pin>456</Pin>
<Details>
<Name>XYZ</Name>
<Age>21</Age>
</Details>
</Students>
<Students>
<Department>ABC</Department>
<Code>123</Code>
<Pin>456</Pin>
<Details>
<Name>KLM</Name>
<Age>22</Age>
</Details>
</Students>
我已经尝试过使用 for-each 但我做不到。
这是我正在尝试的代码。如果我将 for-each 保留在 <students>
中,它将为 <students>
中的每个子项创建新的 XML。如果我在外部使用 for-each XML,如何在范围之外访问 <Students>
的元素。
<?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 s0 userCSharp" version="1.0" xmlns:ns0="Students" xmlns:s0="STDS" xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:template match="/">
<xsl:apply-templates select="/s0:STDS" />
</xsl:template>
<xsl:template match="/s0:STDS">
<ns0:Students>
<xsl:for-each select="s0:STDS">
<xsl:variable name="var:v1" select="s0:DEPT" />
<Department>
<xsl:value-of select="$var:v1" />
</Department>
<xsl:variable name="var:v2" select="s0:COD" />
<Code>
<xsl:value-of select="$var:v2" />
</Code>
<xsl:variable name="var:v3" select="s0:PIN)" />
<Pin>
<xsl:value-of select="$var:v3" />
</Pin>
<xsl:for-each select="s0:STDS/s0:DETS">
<ns0:Details>
<xsl:variable name="var:v4" select="s0:DETS/s0:NAM" />
<Name>
<xsl:value-of select="$var:v4" />
</Name>
<xsl:variable name="var:v5" select="s0:DETS/s0:AGE" />
<Age>
<xsl:value-of select="$var:v5" />
</Age>
<ns0:Details>
</xsl:for-each>
</xsl:for-each>
<ns0:Students>
</xsl:template>
../
功能可用于遍历从子上下文到父上下文的 XML 级别。
以下是您可以使用的 XSL 模板。请注意,输入 XML shared 没有声明任何命名空间,因此在下面的解决方案中没有命名空间的引用。这应该会给你想要的输出。
<xsl:template match="/">
<xsl:for-each select="STDS/DETS">
<Students>
<Department><xsl:value-of select="../DEPT" /></Department>
<Code><xsl:value-of select="../COD" /></Code>
<Pin><xsl:value-of select="../PIN" /></Pin>
<Details>
<Name><xsl:value-of select="NAM" /></Name>
<Age><xsl:value-of select="AGE" /></Age>
</Details>
</Students>
</xsl:for-each>
</xsl:template>
问题被标记为 BizTalk。这是正确的 BizTalk 答案。
在 Mapper 中,您需要做的就是通过 Looping Functoid.
将<DETS>
连接到 <Students>
就是这样,不需要自定义 xslt。是的,就这么简单。
__
无法编辑答案,因为两个不同问题的答案相同。这是 BizTalk 特定的 情况。问题被标记为 BizTalk。虽然它们在技术上可能是正确的,但 Xsl 答案并不是在 BizTalk.
中执行此操作的正确方法删除此答案只会删除正确的 BizTalk 域特定 答案。如果再次删除此答案,好吧,我会放弃,OP 可能会遇到 不必要的复杂和错误的 (对于 BizTalk)解决方案。