我有这样的XML
<Ozellik isim="Renk-Beden">STANDART STD</Ozellik>
<Ozellik isim="Grup">ADMIN</Ozellik>
<Ozellik isim="Amac">DENEME</Ozellik>
<Ozellik isim="BlaBla">BLABLA</Ozellik>
并希望将其转换为此并限制为三个元素。如果有超过3条记录,请取其前三条
<property1 name="Renk-Beden">STANDART STD</property1>
<property2 name="Grup">ADMIN</property2>
<property3 name="Amac">DENEME</property3>
我尝试了很多xslt代码,但无法将其转换为所需的输出。谢谢你的帮助。
我最后一次成功的尝试是:
<xsl:template name="loop">
<xsl:param name="pCount"/>
<xsl:param name="pValue"/>
<xsl:param name="pAtt"/>
<xsl:element name="property{$pCount}">
<xsl:attribute name="name">
<xsl:value-of select="$pAtt" />
</xsl:attribute>
<xsl:value-of select="$pValue" />
</xsl:element>
</xsl:template>
<xsl:template match="Ozellik">
<xsl:param name="pCount" select="0"/>
<xsl:for-each select="catalog/cd">
<xsl:call-template name="loop">
<xsl:with-param name="pCount" select="position()" />
<xsl:with-param name="pValue" select="." />
<xsl:with-param name="pAtt" select="@isim" />
</xsl:call-template>
</xsl:for-each>
</xsl:template>
答案 0 :(得分:1)
使用
<xsl:template match="/">
<xsl:apply-templates select="(//Ozellik)[position() < 4]"/>
</xsl:template>
<xsl:template match="Ozellik">
<xsl:element name="property{position()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="Ozellik/@isim">
<xsl:attribute name="name">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
答案 1 :(得分:0)
修复上一次尝试。这是你需要做的。
删除for-each
元素
<xsl:for-each select="catalog/cd">
<!-- existing inner elements -->
</xsl:for-each>
并将其替换为if
元素。
<xsl:if test="position() < 4">
<!-- existing inner elements -->
</xsl:if>
你的&#34; Ozellik&#34;模板看起来像这样。
<xsl:template match="Ozellik">
<xsl:param name="pCount" select="0"/>
<xsl:if test="position() < 4">
<xsl:call-template name="loop">
<xsl:with-param name="pCount" select="position()" />
<xsl:with-param name="pValue" select="." />
<xsl:with-param name="pAtt" select="@isim" />
</xsl:call-template>
</xsl:if>
</xsl:template>