XSLT - xsl:for-each 238次迭代 - 我只想要1

时间:2018-05-29 12:53:36

标签: xml xslt

我的输出实际上看起来很好,但是xslt-prozessor可以完成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 :(得分:2)

您错过了<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>

另外需要注意的是,您不需要(也不应该)在<xsl:template match="...">表达式中编写绝对XPath。只有部分表达式需要匹配,因此使用match="//row"是不必要的,match="row"完全正常。

答案 1 :(得分:1)

我认为您可以将//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>

运行