XSLTでXPath:2つの他の要素との間の要素を選択し、パートII
-
20-09-2019 - |
解決
変数属性に適合した代替ソリューションは、再帰なしでカウントします。
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="table">
<groups>
<xsl:apply-templates select="tbody/tr[th]"/>
</groups>
</xsl:template>
<xsl:template match="tr[th]">
<group name="{th}">
<xsl:apply-templates select="
following-sibling::tr[not(th)][
generate-id(preceding-sibling::tr[th][1]) = generate-id(current())
]
"/>
</group>
</xsl:template>
<xsl:template match="tr">
<item>
<xsl:apply-templates select="td" />
</item>
</xsl:template>
<xsl:template match="td">
<xsl:attribute name="attribute{position()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
他のヒント
コールテンプレート常にコンテキストとして現在のコンテキスト項目を渡します。
テンプレートを呼び出すときに、そのコンテキストは、「アイテム」を増加させない理由は、再帰的にXSがあることです。あなたはおそらく見たように、変換だけで無限再帰に入ります。
あなたは常に正確に3つの属性を生成する必要があると仮定すると、あなたも再帰を必要としません。
これを試してください:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="table">
<groups>
<xsl:apply-templates select="tbody/tr[th]"/>
</groups>
</xsl:template>
<xsl:template match="tr[th]">
<xsl:variable name="id" select="generate-id(.)"/>
<group name="{string(th)}">
<xsl:apply-templates
select="following-sibling::tr[not(th)][generate-id(preceding-sibling::tr[th][1]) = $id]"/>
</group>
</xsl:template>
<xsl:template match="tr">
<item attribute1="{td[1]}" attribute2="{td[2]}" attribute3="{td[3]}" />
</xsl:template>
</xsl:stylesheet>
これは、各ヘッダー行にテンプレートを適用することによって動作します。これらのテンプレートの各々は、それが最初のヘッダと行の前にいたように、複雑なXPathは、その特定の行を有する任意の次の兄弟行である「その」は、以下の行を呼び出すために使用すること。
もちろん、属性の数が変動した場合は、位置を示すパラメータを渡すことが再帰して増加する必要があります。
あなたがやっていたように、再帰的にそのうちの1つはXSLTのグループ化のための確立された方法がいくつかあります。もう一つの方法は、Muenchianグループと呼ばれています。良い書き込みアップがあるここを。
所属していません StackOverflow