簡體   English   中英

在 XSLT 中的嵌套 For-each 中繼續主循環

[英]Continue Main Looping In Nested For-each In XSLT

我正在嘗試做一些看似不合理的事情,但我有這樣的要求。

希望創建一個嵌套的 for-each 循環,該循環將從外部 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>

外部 for-each 工作正常,但似乎無法使嵌套的 for-each 工作。 有沒有辦法讓我迭代:
其余的<field>標簽(從外部 for-each 留下的地方繼續)
或者
從整個輸入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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM