Как преобразовать XML с само повторяющимися вложенными сложными элементами в плоскую структуру - PullRequest
0 голосов
/ 13 апреля 2019

Мне нужно преобразовать файл XML с несколькими сложными элементами в плоскую структуру. Это пример структуры моего большого XML-файла, который должен быть отформатирован в плоскую структуру, как в требуемом выводе.

Ввод XML -

    <?xml version="1.0" encoding="UTF-8"?>
<tns:Response xmlns:tns="http://www.example.org/response" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/response response.xsd ">
    <tns:Consumer>
        <tns:ConsumerID>tns:ConsumerID</tns:ConsumerID>
        <tns:Relation>
            <tns:ParentEntity>
                <tns:PEID>PE1</tns:PEID>
                <tns:Customer>
                    <tns:CustID>1</tns:CustID>
                    <tns:Relation>
                        <tns:ParentEntity>
                            <tns:PEID>PE2</tns:PEID>
                            <tns:Customer/>
                            <tns:Account/>
                        </tns:ParentEntity>
                        <tns:ChildEntity>
                            <tns:CEID>CE1</tns:CEID>
                            <tns:Customer/>
                            <tns:Account/>
                        </tns:ChildEntity>
                    </tns:Relation>
                </tns:Customer>
                <tns:Account>
                    <tns:AccountId>1</tns:AccountId>
                    <tns:Relation>
                        <tns:ParentEntity>
                            <tns:PEID>PE3</tns:PEID>
                            <tns:Customer/>
                            <tns:Account/>
                        </tns:ParentEntity>
                        <tns:ChildEntity>
                            <tns:CEID>CE2</tns:CEID>
                            <tns:Customer/>
                            <tns:Account/>
                        </tns:ChildEntity>
                    </tns:Relation>
                </tns:Account>
            </tns:ParentEntity>
            <tns:ChildEntity>
                <tns:CEID>CE3</tns:CEID>
                <tns:Customer>
                    <tns:CustID>1</tns:CustID>
                    <tns:Relation>
                        <tns:ParentEntity>
                            <tns:PEID>PE4</tns:PEID>
                            <tns:Customer/>
                            <tns:Account/>
                        </tns:ParentEntity>
                        <tns:ChildEntity>
                            <tns:CEID>CE4</tns:CEID>
                            <tns:Customer/>
                            <tns:Account/>
                        </tns:ChildEntity>
                    </tns:Relation>
                </tns:Customer>
                <tns:Account>
                    <tns:AccountId>1</tns:AccountId>
                    <tns:Relation>
                        <tns:ParentEntity>
                            <tns:PEID>PE5</tns:PEID>
                            <tns:Customer/>
                            <tns:Account/>
                        </tns:ParentEntity>
                        <tns:ChildEntity>
                            <tns:CEID>CE5</tns:CEID>
                            <tns:Customer/>
                            <tns:Account/>
                        </tns:ChildEntity>
                    </tns:Relation>
                </tns:Account>
            </tns:ChildEntity>
        </tns:Relation>
    </tns:Consumer>
</tns:Response>

Требуемый выходной XML -

<?xml version="1.0" encoding="UTF-8"?>
<tns:Response xmlns:tns="http://www.example.org/Required" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/Required Required.xsd ">
    <tns:Consumer>
        <tns:Customer>
            <tns:CustID>tns:CustID</tns:CustID>
        </tns:Customer>
        <tns:Account>
            <tns:AccountId>tns:AccountId</tns:AccountId>
        </tns:Account>
        <tns:Customer>
            <tns:CustID>tns:CustID</tns:CustID>
        </tns:Customer>
        <tns:Account>
            <tns:AccountId>tns:AccountId</tns:AccountId>
        </tns:Account>
        <tns:Customer/>
        <tns:Account/>
        <tns:Customer/>
        <tns:Account/>
    </tns:Consumer>
</tns:Response>

Выходной xml должен иметь только сложные элементы клиента и учетной записи в плоской структуре. Как этого добиться с помощью XSLT. Любая помощь приветствуется. Заранее спасибо.

1 Ответ

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

Я не был уверен, что Вы подразумеваете под "плоской картой", поскольку Ваша структура Customer - Account определяет отношения с родителями и детьми.Вот фрагмент кода XSLT для выравнивания всех Customer и Account, упомянутых в XML.Можно настроить только детей на каждом уровне.Но я не смог понять это точно, проанализировав Ваш ожидаемый результат, так как в XML-входных данных нет соответствующих идентификаторов, соответствующих идентификаторам:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tns="http://www.example.org/response" >

<xsl:template match="/">
  <tns:Response>
    <xsl:apply-templates/>
  </tns:Response>
</xsl:template>

<xsl:template match="tns:Consumer">
  <tns:Consumer>
    <xsl:apply-templates/>
  </tns:Consumer>
</xsl:template>

<xsl:template match="tns:Customer">
  <tns:Customer>
    <tns:CustID><xsl:value-of select="tns:CustID"/></tns:CustID>
  </tns:Customer>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="tns:Account">
  <tns:Account>
    <tns:AccountId><xsl:value-of select="tns:AccountId"/></tns:AccountId>
  </tns:Account>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()" />

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...