XSLT - xsl: для каждых 238 итераций - я просто хочу 1 - PullRequest
0 голосов
/ 29 мая 2018

Мой вывод на самом деле выглядит нормально, но xslt-prozeror делает это 238 (точно) раз.Как он делает 238 итераций, я получаю 238 копий одного и того же ... Исходный XML-файл содержит 1000 строк, выходной XML-файл содержит 238000 пост-элементов.Чего мне не хватает?

Мой XML

<csv_data><row>
    <stuff1>Stuff_here_1</stuff1>
    <stuff2>Stuff_here_2</stuff2>
    <stuff3>Stuff_here_3</stuff3>
    <stuff4>Stuff_here_4</stuff4>
    <stuff5>Here will be some text</stuff5>
</row>
<row>
    <stuff1>Stuff_here_11</stuff1>
    <stuff2>Stuff_here_22</stuff2>
    <stuff3>Stuff_here_33</stuff3>
    <stuff5>Here will be some text</stuff5>
</row></csv_data>

Мой XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
        <xsl:template match="csv_data">
        <TEI xmlns="http://www.tei-c.org/ns/1.0">
            <someHeader>
            <text>
                <body>
                    <div type="sometype">
                            <xsl:apply-templates select="@* | node()"/>
                    </div>
                </body>
            </text>
        </TEI>
    </xsl:template>
    <xsl:template match="//row">
            <xsl:for-each select="//row">
                <post attribute1="{stuff1}" attribute2="{stuff2}" attribute3="{stuff3}" attribute4="{stuff4}">
                   <p>
<xsl:value-of select="stuff5"/>
</p>
                    </post>
            </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вам не хватает того факта, что <xsl:apply-templates> уже работает как цикл.Вам не нужно <xsl:for-each> вообще.

Напишите свой <xsl:template match="row">, чтобы он выдал правильный вывод для один <row>.Шаблон будет выполняться несколько раз автоматически.

Однако я рекомендую более конкретный вызов <xsl:apply-templates>.Вы хотите выбрать только <row> элементов, поэтому логично было бы использовать select="row".

<xsl:stylesheet
    version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
>
    <xsl:template match="csv_data">
        <TEI xmlns="http://www.tei-c.org/ns/1.0">
            <someHeader>
            <text>
                <body>
                    <div type="sometype">
                        <xsl:apply-templates select="row" />
                    </div>
                </body>
            </text>
        </TEI>
    </xsl:template>

    <xsl:template match="row">
        <post attribute1="{stuff1}" attribute2="{stuff2}" 
            attribute3="{stuff3}" attribute4="{stuff4}" />
    </xsl:template>
</xsl:stylesheet>

Еще одна вещь, на которую следует обратить внимание: вам не нужно (и не следует) писать абсолютныеXPaths в <xsl:template match="..."> выражениях.Только часть выражения должна соответствовать, поэтому использование match="//row" не нужно, а match="row" совершенно нормально.

0 голосов
/ 29 мая 2018

Я думаю, вы можете изменить //row на .

В этих строках вы определяете шаблон для любой <row>

<xsl:template match="//row">
        <xsl:for-each select="//row">

for-each снова (!) Выполнит действие для любого <row>

Попробуйте это так

<xsl:template match="row">
        <xsl:for-each select=".">

for-each будет работать с данными ниже <row>

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