說我有這樣的XML:避免重複屬性的名稱與XSLT/XPath的
<parole>
<parola id="a">1</parola>
<parola id="b">2</parola>
<parola id="c">3</parola>
<parola id="a">4</parola>
<parola id="a">5</parola>
<parola id="b">6</parola>
</parole>
現在,我知道generate-id()
函數存在。但是,爲了學習目的,我想知道如何使用XSLT更改名爲「id」的屬性值。
我想過的「算法」,如:
考慮以下和屬性的前面的兄弟。
如果您遇到了當前屬性的副本,請在該名稱的末尾添加「f」並遞歸添加另一個「f」,直到我們沒有更多具有相同值的屬性。
所以我最後的XML會是這樣:
<parole>
<parola id="a">1</parola>
<parola id="b">2</parola>
<parola id="c">3</parola>
<parola id="af">4</parola>
<parola id="aff">5</parola>
<parola id="bf">6</parola>
</parole>
現在,我試圖得到這樣的結果與像一個遞歸函數:
<xsl:variable name="following-siblings-ids" select="/parole/parola/following-sibling::parola/@id"/>
<xsl:variable name="preceding-siblings-ids" select="/parole/parola/preceding-sibling::parola/@id"/>
<xsl:function name="du:check" as="xs:string">
<xsl:param name="id" />
<xsl:choose>
<xsl:when test="$id = $following-siblings-ids and $preceding-siblings-ids">
<xsl:value-of select="du:check(concat($id, 'f'))"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$id"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
<xsl:template match="parola">
<xsl:value-of select="du:check(@id)"/>
</xsl:template match="parola">
但我得到這樣一個結果
「AF」, 「BF」, 「CF」, 「AF」, 「AF」, 「BF」
而不是所需的一個。
任何提示?這將是一個非動態變量和for-each
的非聲明性語言的簡單任務,但我不知道如何在XSLT中實現它...
應該不是你的樣本文檔中的第一行有ID * A *,而不是* AF *? – Markus
您應該計算前面的@ id與當前相同,並在最後添加許多f。你可能沒有碰到的地方是你寫的地方(「遞歸地)添加另一個f」,這意味着你必須在前一次迭代的結果上運行* n *次(但是在你的邏輯中可能存在另一個錯誤) –
是的,已更正,@Markus – AmintaCode