XSLT рекурсивно реорганизует XML Children - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь проанализировать некоторые данные из SurveyMonkey в пригодный для использования формат XML для внутреннего приложения. Результаты SurveyMonkey получаются довольно неуклюжими. Вопросы отсортированы по «странице», которую они изучают, на которой они появляются. Значение, используемое для атрибута ответа на заданный вопрос, вложено в некоторый дочерний тип идентификатора. Вот краткий пример:

<root>
...
    <pages>
        <questions>
            <answers>
                <text>John</text>
                <row_id>123456789</row_id>
            </answers>
            <answers>
                <text>Smith</text>
                <row_id>123456790</row_id>
            </answers>
            <answers>
                <text>jsmith@example.com</text>
                <row_id>123456791</row_id>
            </answers>
            <id>987654321</id>
        </questions>
        <questions>
            <answers>
                <choice_id>144018495</choice_id>
            </answers>
            <id>987654322</id>
        </questions>
        <questions>
            <answers>
                <choice_id>489456456</choice_id>
            </answers>
            <answers>
                <choice_id>159489464</choice_id>
            </answers>
            <id>987654323</id>
        </questions>
        <id>48946496849</id>
    </pages>
    <pages>
        <questions>
            <answers>
                <choice_id>144018495</choice_id>
            </answers>
            <id>987654324</id>
        </questions>
        <questions>
            <answers>
                <choice_id>489456456</choice_id>
            </answers>
            <answers>
                <choice_id>159489464</choice_id>
            </answers>
            <id>987654325</id>
        </questions>
        <id>1541561518</id>
    </pages>
....
    <id>8594816548</id>
</root>

И то, во что я пытаюсь это преобразовать, имеет много структурных и порядковых зависимостей. Использование {...} для обозначения значений сверху

<DataExchange>
    <Source>XMLIMPORT</Source>
    <EffectData>
        <DataSet>
            <Source>XMLIMPORT</Source> 
            <IDContainer>
                <FlexiID>
                    <key>ID_KEY</key>
                    <value>{/root/id}</value>
                </FlexibleID>
            </IDContainer>
            <MasterData>
                <FirstName>{/root/pages/questions/text where row_id = 123456789}</FirstName>
                <LastName>{/root/pages/questions/text where row_id = 123456790}</LastName>
                <ContactDetails>
                    <Email>{/root/pages/questions/text where row_id = 123456791}</Email>
                    <Phone1>{...}</Phone1>
                    <Phone2>{...}</Phone2>
                </ContactDetails>
            </MasterData>
            <Organization>hardcoded</Organization>
            {if Choice_ID = x in Question y then...}
            <Flags>
                <FromDate>
                    <key>ID_KEY</key>
                    <value>{/root/id}</value>
                </FlexibleID>
            </IDContainer>
            ...
        </DataSet>
    </EffectData>
</DataExchange>

Ты понял суть. Это ужасно, когда ответы на вопросы, вложенные в страницы, не соответствуют порядку. Я просто не могу сейчас взять и ответить на элемент страницы 4th Survey Monky и поместить его полностью впереди. XSD для XML довольно жесток по порядку элементов, поэтому я должен много чего здесь переделать. Могу ли я скопировать всех детей из процесса? Любая помощь / мысли / молитвы?

-CJW

1 Ответ

0 голосов
/ 09 января 2019

Вы можете достичь большинства из того, что вы хотите с помощью следующего шаблона. Просто замените {...} на соответствующие <xsl:value-of select="..." /> выражения.

<xsl:template match="/root">
    <DataExchange>
        <Source>XMLIMPORT</Source>
        <EffectData>
            <DataSet>
                <Source>XMLIMPORT</Source> 
                <IDContainer>
                    <FlexibleID>
                        <key>ID_KEY</key>
                        <value><xsl:value-of select="/root/id" /></value>
                    </FlexibleID>
                </IDContainer>
                <MasterData>
                    <FirstName><xsl:value-of select="/root/pages/questions/answers[row_id='123456789']/text" /></FirstName>
                    <LastName><xsl:value-of select="/root/pages/questions/answers[row_id='123456790']/text" /></LastName>
                    <ContactDetails>
                        <Email><xsl:value-of select="/root/pages/questions/answers[row_id='123456791']/text" /></Email>
                        <Phone1><xsl:value-of select="'Phone1'" /></Phone1>
                        <Phone2><xsl:value-of select="'Phone2'" /></Phone2>
                    </ContactDetails>
                </MasterData>
                <Organization>hardcoded</Organization>
                {if Choice_ID = x in Question y then...}
                <Flags>
                    <FromDate>
                        <key>ID_KEY</key>
                        <value><xsl:value-of select="/root/id" /></value>
                    </FromDate>
                    <!-- </FlexibleID> -->
                </Flags>
                <!-- </IDContainer>  -->
                ...
            </DataSet>
        </EffectData>
    </DataExchange>
</xsl:template>

Я не смог реализовать ваш {if Choice_ID = x in Question y then...}, потому что он слишком неопределенный.

...