xslt转换和限制

时间:2014-07-25 09:45:16

标签: xml xslt xslt-1.0

我有这样的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>

2 个答案:

答案 0 :(得分:1)

使用

<xsl:template match="/">
  <xsl:apply-templates select="(//Ozellik)[position() &lt; 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() &lt; 4">
   <!-- existing inner elements -->
</xsl:if>

你的&#34; Ozellik&#34;模板看起来像这样。

<xsl:template match="Ozellik">
  <xsl:param name="pCount" select="0"/>
  <xsl:if test="position() &lt; 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>