【问题标题】:extract each child node to create XML with parent nodes提取每个子节点以创建带有父节点的 XML
【发布时间】:2019-04-12 06:11:05
【问题描述】:

我有一个输入 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 保留在 &lt;students&gt; 中,它将为 &lt;students&gt; 中的每个孩子创建新的 XML。如果我在外面使用for-each XML,如何访问&lt;Students&gt;的元素超出范围。

<?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>

【问题讨论】:

  • 请编辑问题并分享尝试过的 XSL,以便对其进行修改。输出 XML 显示您还将所有节点重命名为输入 XML 中的新名称。
  • 我已经添加了代码。
  • 为什么要使用Xsl?这可以通过 Map 中的一个 Functoid 来完成。

标签: xml xslt biztalk


【解决方案1】:

../ 功能可用于从子上下文到父上下文遍历 XML 级别。

以下是您可以使用的 XSL 模板。请注意,输入 XML 共享没有声明任何命名空间,因此在以下解决方案中没有命名空间的引用。这应该会给你想要的输出。

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

【讨论】:

  • 为了未来读者的利益,您不需要自定义 Xslt 在 BizTalk 中执行此操作。它只会增加不必要的复杂性。
【解决方案2】:

问题被标记为 BizTalk。这是正确的 BizTalk Asnwer。

在 Mapper 中,您只需通过 Looping Functoid 将 &lt;DETS&gt; 连接到 &lt;Students&gt;

就是这样,不需要自定义 xslt。是的,就是这么简单。

__

无法编辑答案,因为对于两个不同的问题,答案是相同的。这是 BizTalk 特定 情况。该问题被标记为 BizTalk。虽然它们在技术上可能是正确的,但 Xsl 答案并不是在 BizTalk 中执行此操作的正确方法。

删除此答案只会删除正确的 BizTalk 域特定答案。如果再次删除此答案,很好,我会放弃,OP 可能会遇到不必要的复杂和错误(对于 BizTalk)解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多