3

私はxslを初めて使用します。私は以下のxmlを持っています:

    <record>
<fruit>Apples</fruit>
<fruit>Oranges</fruit>
<fruit>Bananas</fruit>
<fruit>Plums</fruit>
<vegetable>Carrots</vegetable>
<vegetable>Peas</vegetable>
<candy>Snickers</candy>

キー関数を使用して出力ファイルを作成したい:

     <record> 1
--<fruit> 4
--<vegetable> 2
--<candy> 1

解決策はありますか?

4

2 に答える 2

2

これと同じくらい簡単

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:key name="kElemByName" match="*" use="name()"/>

 <xsl:template match=
  "*[not(generate-id()=generate-id(key('kElemByName',name())[1]))]"/>

 <xsl:template match="*">
  <xsl:value-of select=
  "concat('&lt;',name(),'> ', count(key('kElemByName',name())),'&#xA;')"/>
  <xsl:apply-templates select="*"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<record>
    <fruit>Apples</fruit>
    <fruit>Oranges</fruit>
    <fruit>Bananas</fruit>
    <fruit>Plums</fruit>
    <vegetable>Carrots</vegetable>
    <vegetable>Peas</vegetable>
    <candy>Snickers</candy>
</record>

必要な正しい結果が生成されます。

<record> 1
<fruit> 4
<vegetable> 2
<candy> 1
于 2013-01-12T04:11:31.600 に答える
1

ハイフンを含めるには(ディミトレの回答をベースとして使用するので、彼に当然のクレジットを与えてください)、これを行うことができます:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:key name="kElemByName" match="*" use="name()"/>

  <xsl:template match=
  "*[not(generate-id()=generate-id(key('kElemByName',name())[1]))]">
    <xsl:apply-templates select="*" />
  </xsl:template>

  <xsl:template match="*">

    <xsl:apply-templates select="ancestor::*" mode="hyphens" />

    <xsl:value-of select=
       "concat('&lt;',name(),'> ', count(key('kElemByName',name())),'&#xA;')"/>
    <xsl:apply-templates select="*"/>
  </xsl:template>

  <xsl:template match="*" mode="hyphens">
    <xsl:text>--</xsl:text>
  </xsl:template>
</xsl:stylesheet>

元の入力を使用すると、次が生成されます。

<record> 1
--<fruit> 4
--<vegetable> 2
--<candy> 1

より深くネストされた入力では、

<record>
  <fruit>
    Apples
  </fruit>
  <fruit>
    <citrus>Grapefruits</citrus>
    <citrus>Oranges</citrus>
    <citrus>Lemons</citrus>
  </fruit>
  <fruit>Bananas</fruit>
  <fruit>
    <pitted>Plums</pitted>
    <pitted>Apricots</pitted>
    <pitted>Peaches</pitted>
  </fruit>
  <vegetable>Carrots</vegetable>
  <vegetable>Peas</vegetable>
  <candy>
    <chocolate>Snickers</chocolate>
    <chocolate>Milky Way</chocolate>
    <chocolate>Hersheys</chocolate>
  </candy>
  <candy>
    <hard>Lozenges</hard>
    <hard>Lollipops</hard>
  </candy>
</record>

あなたは得る:

<record> 1
--<fruit> 4
----<citrus> 3
----<pitted> 3
--<vegetable> 2
--<candy> 2
----<chocolate> 3
----<hard> 2

どのようだ?

于 2013-01-12T15:02:25.877 に答える