1

XML から一意の値とその発生回数を抽出しようとしています。

私はXsltの個別の選択/グループ化で与えられた答えに従っていますが、私のスキーマは少し異なります。

私の XML は次のようになります。

<A>
    <B>
        <C>
            <D>APPLE</D>
        </C>
    </B>
    <B>
        <C>
            <D>BANANA</D>
        </C>
    </B>
    <B>
        <C>
            <D>APPLE</D>
        </C>
    </B>
</A>

私が持っている前の回答のコードに基づいて:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" />

  <xsl:key 
    name="C-by-DValue" 
    match="B/C/D" 
    use="text()" 
  />

  <xsl:template match="A">
    <xsl:for-each select="
      B/C/D[
        count(
          . | key('C-by-DValue', B/C/D/text())[1]
        ) = 1
      ]
    ">
      <xsl:value-of select="text()"/>
      <xsl:value-of select="' - '"/>
      <!-- simple: the item count is the node count of the key -->
      <xsl:value-of select="
        count(
          key('C-by-DValue', text())
        )
      "/>
      <xsl:value-of select="'&#10;'"/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

しかし、これは次を返します:

APPLE - 2
BANANA - 1
APPLE - 2

したがって、for-each-select は、各 text() 値の最初のインスタンスと一致するだけではありません。誰かが私を正しい方向に向けてください。

4

2 に答える 2

4

変えたい

<xsl:template match="A">
    <xsl:for-each select="
      B/C/D[
        count(
          . | key('C-by-DValue', B/C/D/text())[1]
        ) = 1
      ]
    ">
      <xsl:value-of select="text()"/>
      <xsl:value-of select="' - '"/>
      <!-- simple: the item count is the node count of the key -->
      <xsl:value-of select="
        count(
          key('C-by-DValue', text())
        )
      "/>
      <xsl:value-of select="'&#10;'"/>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="A">
    <xsl:for-each select="
      B/C/D[
        count(
          . | key('C-by-DValue',.)[1]
        ) = 1
      ]
    ">
      <xsl:value-of select="text()"/>
      <xsl:value-of select="' - '"/>
      <!-- simple: the item count is the node count of the key -->
      <xsl:value-of select="
        count(
          key('C-by-DValue', text())
        )
      "/>
      <xsl:value-of select="'&#10;'"/>
    </xsl:for-each>
于 2012-06-18T13:02:57.323 に答える
2

を使用せずに、このグループ化タスクをはるかに短い方法で実行できxsl:for-eachます。

この変換:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:key name="kDByVal" match="D" use="."/>

 <xsl:template match="D[generate-id()=generate-id(key('kDByVal', .)[1])]">
  <xsl:value-of select=
   "concat(., ' - ', count(key('kDByVal', .)), '&#xA;')"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<A>
    <B>
        <C>
            <D>APPLE</D>
        </C>
    </B>
    <B>
        <C>
            <D>BANANA</D>
        </C>
    </B>
    <B>
        <C>
            <D>APPLE</D>
        </C>
    </B>
</A>

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

APPLE - 2
BANANA - 1
于 2012-06-18T13:05:23.547 に答える