извлечь каждый дочерний узел для создания XML с родительскими узлами - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть входной 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 внутри <students>, он создаст новый XML для каждого дочернего элемента внутри <students>.если я использую 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>

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Вопрос помечен BizTalk .Это правильный BizTalk Asnwer.

В Mapper все, что вам нужно сделать, это подключить <DETS> к <Students> через петлевой функтоид .

Вот и все, не требуется пользовательский xslt .Да, это так просто.

__

Нет способа отредактировать ответ, поскольку это один и тот же ответ для двух разных вопросов.Это BizTalk специфическая ситуация.Вопрос помечен BizTalk .Хотя они могут быть технически правильными, ответы Xsl не являются правильным способом сделать это в BizTalk .

Удаление этого ответа просто удаляет правильный специфичный для домена BizTalk ответ.Если этот ответ снова будет удален, хорошо, я просто сдамся, и OP может бороться с излишне сложным и неправильным (для BizTalk) решением.

0 голосов
/ 12 апреля 2019

Функцию ../ можно использовать для прохождения уровней 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...