继续XSLT中嵌套For each中的主循环



我试图做一些看似不合理的事情,但我有这样的请求的原因。

希望为每个循环创建一个嵌套循环,该循环将从外部为每个循环继续或重新开始,如以下示例所示。

以下是输入xml,此输入表示我正在使用的结构,但使用伪数据。XML:

<table>
<Row>
<Field name="ver">1</field>
<Field name="isNewVersion">1</field>
<Field name="sub">a</field>
</Row>
<Row>
<Field name="ver">1</field>
<Field name="isNewVersion">0</field>
<Field name="sub">b</field>
</Row>
<Row>
<Field name="ver">1</field>
<Field name="isNewVersion">0</field>
<Field name="sub">c</field>
</Row>
<Row>
<Field name="ver">2</field>
<Field name="isNewVersion">1</field>
<Field name="sub">x</field>
</Row>
<Row>
<Field name="ver">2</field>
<Field name="isNewVersion">0</field>
<Field name="sub">y</field>
</Row>
</table>

outer for each可以很好地工作,但似乎无法使嵌套的for each工作。对我来说,有没有一种方法可以迭代:
其余的<field>标记(继续每个标记的外部标记所省略的位置(
OR
从整个输入xml的开头开始

XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Main>
<xsl:for-each select="table/Row">

<xsl:if select="field[@name='isNewVersion'] = 1">   <!--check if first sub per new version-->

<Data ver="{field[@name='ver'}">

<xsl:variable name="currentVer" select="{field[@name='ver'}" /> <!--saved for nested for-each-->                
<xsl:for-each select="..."> <!--This is the problem, would like to iterate from the start of xml-->

<xsl:if select="{field[@name='ver'] = currentVer}"> <!--check if came to new version-->

<Sub id="{field[@name='sub']}" />
</xsl:if>

</xsl:for-each>

</Data>
</xsl:if>


</xsl:for-each>
</Main>
</xsl:template>
</xsl:stylesheet>

这就是我希望最终(输出(xml的样子。我想要的输出:

<Main>
<Data ver="1">
<Sub id="a" />
<Sub id="b" />
<Sub id="c" />
</Data>
<Data ver="2">
<Sub id="x" />
<Sub id="y" />
</Data>
</Main>

感谢您的帮助:(

这样试试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="row-by-ver" match="Row" use="field[@name='ver']" />
<xsl:template match="/table">
<Main>
<xsl:for-each select="Row[field[@name='isNewVersion'] = 1]">
<xsl:variable name="version" select="field[@name='ver']" />
<Data ver="{$version}">
<xsl:for-each select="key('row-by-ver', $version)">
<Sub id="{field[@name='sub']}" />
</xsl:for-each>
</Data>
</xsl:for-each>
</Main>
</xsl:template>
</xsl:stylesheet>

注意

XML区分大小写。fieldField不同,您的输入将在的每一行上产生错误

<Field name="x">y</field>

最新更新