我的输出实际上看起来很好,但是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>
答案 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>