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

Я хотел бы найти общее преобразование xslt, которое могло бы решить эту проблему. Предположим, чтобы иметь этот XML

<Train>
    <GeneralData>
        <TrainNumber>123</TrainNumber>
    </GeneralData>
    <ArrayOfCoaches>
        <Coach>
            <CoachNumber>1</CoachNumber>
            <CoachSeats>18</CoachSeats>
        </Coach>
        <Coach>
            <CoachNumber>2</CoachNumber>
            <CoachSeats>23</CoachSeats>
        </Coach>
        <Coach>
            <CoachNumber>3</CoachNumber>
            <CoachSeats>34</CoachSeats>
        </Coach>
    </ArrayOfCoaches>
</Train>

Я хотел бы иметь возможность "разбить" это сообщение, создав несколько разделов, содержащих только одного тренера, подобного этому

<ArrayOfTrainCoaches>
    <Train>
        <GeneralData>
            <TrainNumber>123</TrainNumber>
        </GeneralData>
        <ArrayOfCoaches>
            <Coach>
                <CoachNumber>1</CoachNumber>
                <CoachSeats>18</CoachSeats>
            </Coach>
        </ArrayOfCoaches>
    </Train>
    <Train>
        <GeneralData>
            <TrainNumber>123</TrainNumber>
        </GeneralData>
        <ArrayOfCoaches>
            <Coach>
                <CoachNumber>2</CoachNumber>
                <CoachSeats>23</CoachSeats>
            </Coach>
        </ArrayOfCoaches>
    </Train>
    <Train>
        <GeneralData>
            <TrainNumber>123</TrainNumber>
        </GeneralData>
        <ArrayOfCoaches>
            <Coach>
                <CoachNumber>3</CoachNumber>
                <CoachSeats>34</CoachSeats>
            </Coach>
        </ArrayOfCoaches>
    </Train>
</ArrayOfTrainCoaches>

Мне не ясно, как использовать for-each для дублирования всего сообщения, за исключением некоторой подструктуры, которую я хочу разделить на выделенные копии всего сообщения.

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018
<xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Train">
        <ArrayOfTrainCoaches>
        <xsl:for-each select="ArrayOfCoaches/Coach">

            <Train>
                <xsl:copy-of select="ancestor::Train/GeneralData"/>
                <ArrayOfCoaches>
                <xsl:copy-of select="."/>
                    </ArrayOfCoaches>
            </Train>

        </xsl:for-each>
            </ArrayOfTrainCoaches>
    </xsl:template>
Look it
0 голосов
/ 27 июня 2018

выглядит как:

<ArrayOfTrainCoaches>
  <xsl:for-each select="//Coach">
    <Train>
        <xsl:copy-of select="//GeneralData"/>
        <ArrayOfCoaches>
            <xsl:copy-of select="."/>
        </ArrayOfCoaches>
    </Train>
  </xsl:for-each>
</ArrayOfTrainCoaches>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...