Как преобразовать XSTL в XSLT с добавлением дополнительных тегов - PullRequest
0 голосов
/ 19 февраля 2020

Я новичок в XSLT 1.0, где у меня есть ниже XML, который мы передаем в XSLT для генерации PDF.

XML:

<Family>
     <Description>General psychiatry</Description>
</Family> 

<Family>
    <Description>Liaison Psychiatry</Description>
    <Parent>General psychiatry</Parent>
</Family>

 <Family>
    <Description>Old age psychiatry</Description>
</Family>

<Family>
    <Description>General psychiatry</Description>
</Family> 

<Family>
     <Description>Liaison</Description>
     <Parent>General psychiatry</Parent>
</Family>

Случай 1: первый-семейный тег содержит имя родителя (описание), а второй-семейный тег содержит имя ребенка (описание) и родительское имя (родитель) .

Случай 2: будет иметь только первый семейный тег, содержащий имя родителя (описание), но второго семейного тега не будет.

Теперь мне нужно сгруппировать вышесказанное на основе Родитель-ребенок / ребенок, я подумал об использовании МЕХАНЧЕСКОГО МЕТОДА, но для этого нужно, чтобы у всех семейных тегов были одинаковые вложенные теги, и я также не могу изменить формат XML.

Любое предложение по преодолению вышеупомянутых 2 групп и групп, основанных на теге Family, является наиболее ценным. Спасибо

1 Ответ

0 голосов
/ 19 февраля 2020

В XSLT 2.0 вы можете использовать для каждой группы

<xsl:template match="root">
        <xsl:copy>
            <xsl:for-each-group select="//Family[count(*) = 1][Description]" group-by=".">
                <xsl:copy>
                    <xsl:copy-of select="Description"/>
                    <xsl:if test="//Family[Parent = current-group()[1]/Description]">
                        <SubFamily>
                            <xsl:for-each select="//Family[Parent = current-group()[1]/Description]">
                                <xsl:copy-of select="Description"/>
                            </xsl:for-each>
                        </SubFamily>
                    </xsl:if>
                </xsl:copy>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

См. Преобразование в https://xsltfiddle.liberty-development.net/3NSTbfe

В XSLT 1.0 с использованием MUENCHIAN METHOD

<xsl:key name="parent" match="Family" use="Description"/>

        <xsl:key name="child" match="Family" use="Parent"/>

        <xsl:template match="root">
            <xsl:copy>
                <xsl:for-each select="Family[not(Parent)][generate-id() = generate-id(key('parent', Description)[1])]">
                    <xsl:copy>
                        <xsl:copy-of select="Description"/>
                        <xsl:if test="//Family[Parent = current()/Description]">
                            <SubFamily>
                                <xsl:for-each select="//Family[Parent = current()/Description]">
                                    <xsl:copy-of select="Description"/>   
                                </xsl:for-each>
                            </SubFamily>
                        </xsl:if>
                    </xsl:copy>
                </xsl:for-each>
            </xsl:copy>
        </xsl:template>

См. Преобразование в https://xsltfiddle.liberty-development.net/3NSTbfe/1

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