XSLT: копирование определенных элементов как дочерних элементов другого элемента - PullRequest
0 голосов
/ 02 декабря 2018

Я знаю, что это преобразование довольно тривиально;но к сожалению я застрял.Мой ввод следующий:

<?xml version="1.0" encoding="UTF-8"?>
<tests>
    <test>Biography</test>
    <test>Job</test>
    <test>Salary</test>
    <test>FirtsName</test>
    <test>John</test>
    <test>Mary</test>
    <test>David</test>
    <test>Isabella</test>
    <test>SecondName</test>
    <test>Jones</test>
    <test>Williams</test>
    <test>Biography</test>
    <test>Job</test>
    <test>Salary</test>
    <test>FirtsName</test>
    <test>Paul</test>
    <test>Peter</test>
    <test>SecondName</test>
    <test>Castro</test>
    <test>Ricci</test>
<tests>

Что я хочу сделать, используя xslt 2.0, это выбрать все элементы между элементом "" test "со значением" FirstName "и элементом" test "сзначение «SecondName» и скопируйте их как потомки их первого предшествующего элемента «test» со значением «Biography». OUTPUT должно выглядеть следующим образом.

<?xml version="1.0" encoding="UTF-8"?>
<tests>
    <test>Biography
        <test>John</test>
        <test>Mary</test>
        <test>David</test>
        <test>Isabella</test>
    </test>
    <test>Job</test>
    <test>Salary</test>
    <test>FirtsName</test>
    <test>SecondName</test>
    <test>Jones</test>
    <test>Williams</test>
    <test>Biography
        <test>Paul</test>
        <test>Peter</test>
    </test>
    <test>Job</test>
    <test>Salary</test>
    <test>FirtsName</test>
    <test>SecondName</test>
    <test>Castro</test>
    <test>Ricci</test>
</tests>

Большое спасибоза вашу помощь:)

1 Ответ

0 голосов
/ 02 декабря 2018

Посмотрите, поможет ли это:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/tests">
    <xsl:copy>
        <xsl:for-each-group select="test" group-starting-with="test[.='Biography']">
            <xsl:variable name="names" select="current-group()[. >> current-group()[.='FirtsName'] and . &lt;&lt; current-group()[.='SecondName']]" />
            <test>
               <xsl:value-of select="current-group()[1]"/> 
               <xsl:text>&#10;</xsl:text>
               <xsl:copy-of select="$names"/>
            </test>
            <xsl:copy-of select="current-group()[position() gt 1] except $names" />
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Демо : https://xsltfiddle.liberty -развитие.net / 94hvTAk

...