言って名前を属性。しかし、学習目的のために、 "id"という属性の値をXSLTで変更する方法を知りたいと思います。私のような「アルゴリズム」について考えてきました避け、私はそのようなXMLを持っているXSLT/XPathの
:
は、以下の属性の前の兄弟を検討してください。
現在の属性の重複を満たす場合は、同じ名前の属性がなくなるまで、この名前の末尾に "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"
所望のものの代わりに10
である。
ヒントこれは、動的変数とfor-each
の非宣言言語の単純なタスクですが、私はXSLTでそれを実現する方法がわかりません...
はあなたのサンプル文書の最初の行は、ID * A *の代わりに、* AF *を持っていないでしょうか? – Markus
あなたはおそらく前の@ idを現在のものと同じものに数え、最後にfを追加するべきです。おそらくヒットしていないポイントは、「(再帰的に)別のfを追加する」という場所です。これは、前の繰り返しの結果に対して* n *回実行する必要があることを意味します(ただし、 ) –
はい、修正済み、@マークス – AmintaCode