0

ソース XML:

<r:root xmlns:r="http://root/">
<p:parent xmlns:p="http://parent/">
    <p:name>John</name>
    <p:age>30</age>
    <c:child xmlns:c="http://child/">
        <c:cname>John_child_1</cname>
        <c:cage/>
        <c:ItemNumber>1</ItemNumber>
    </child>
    <c:child xmlns:c="http://child/">
        <c:cname>John_child_2</cname>
        <c:cage/>
        <c:ItemNumber>2</ItemNumber>
    </child>
    <c:child xmlns:c="http://child/">
        <c:cname>John_child_3</cname>
        <c:cage/>
        <c:ItemNumber>1</ItemNumber>
    </child>
</parent>
<p:parent>
    <p:name>Doe</name>
    <p:age>40</age>
    <c:child xmlns:c="http://child/">
        <c:cname>Doe_child_1</cname>
        <c:cage/>
        <c:ItemNumber>2</ItemNumber>
    </child>
    <c:child xmlns:c="http://child/">
        <c:cname>Doe_child_2</cname>
        <c:cage/>
        <c:ItemNumber>2</ItemNumber>
    </child>
</parent>
...
...
...

ターゲット XML:

<root>
<f:father xmlns:f="http://father/">
    <f:name>John</name>
    <f:age>30</age>
    <f:UniqueItemNumber>1</UniqueItemNumber>
    <c:child xmlns:c="http://child/">
        <c:cname>John_child_1</cname>
        <c:cage/>
        <c:ItemNumber>1</ItemNumber>
    </child>
    <c:child xmlns:c="http://child/">
        <c:cname>John_child_3</cname>
        <c:cage/>
        <c:ItemNumber>1</ItemNumber>
    </child>
</father>
<f:father xmlns:f="http://father/">
    <f:name>John</name>
    <f:age>30</age>
    <f:UniqueItemNumber>2</UniqueItemNumber>
    <c:child xmlns:c="http://child/">
        <c:cname>John_child_2</cname>
        <c:cage/>
        <c:ItemNumber>2</ItemNumber>
    </child>
</father>
<f:father xmlns:f="http://father/">
    <f:name>Doe</name>
    <f:age>40</age>
    <f:UniqueItemNumber>2</UniqueItemNumber>
    <c:child xmlns:c="http://child/">
        <c:cname>Doe_child_1</cname>
        <c:cage/>
        <c:ItemNumber>2</ItemNumber>
    </child>
    <c:child xmlns:c="http://child/">
        <c:cname>Doe_child_2</cname>
        <c:cage/>
        <c:ItemNumber>2</ItemNumber>
    </child>
</father>
....
...

XSLT を使用して、表示されているターゲット xml に変換したいソース xml があります。

ソースでは、それぞれが複数の子を含む複数の親要素を持つことができます。ターゲットを生成するには、まず、各親のすべての子の ItemNumber の個別のリストを見つける必要があります。したがって、ターゲット xml の父要素は、ソース xml の一意の ItemNumber ごとにマップする必要があります。これは、親ごとに ItemNumber でグループ化する SQL の group-by 句のようなものと言えます。この例で状況が説明されることを願っています。

私はあらゆる種類のことを試してきましたが、解決策に近づいていません。解決策を形成しているときに複数の問題が発生しています。したがって、キーは for-each(parent) 要素内で定義する必要があります。私はここで混乱しています。2. トップレベルの for-each(Parent) を持つべきだと思います。その中に、一意の ItemNumber を決定する方法があります。そして、親の名前を取得するために使用しようとすると、コントロールが 2 番目の for-each(uniqueItemNumber) 内にある場合、xpath (/name) が無効であるため、何も取得されません。問題を説明するのは難しい。

ここで解決できることを願っています。前もって感謝します。

4

1 に答える 1

0

Muenchianグループ化を使用して、このように要素内でグループ化できます。秘訣は、グループ化キーの一部として各親要素に固有のものを含めることですそれgenerate-id()は通常、良い候補です。

<xsl:key name="childrenByNumber "match="c:child"
    use="concat(generate-id(..), '+', c:ItemNumber)"/>

親内のグループを抽出する場合は、同じ方法でルックアップ キーを作成します。

<xsl:template match="p:parent">
  <xsl:variable name="p" select="."/>
  <xsl:for-each select="c:child[generate-id() =
      generate-id(key('childrenByNumber', concat(generate-id($p), '+', c:ItemNumber))[1])]">
    <f:father xmlns:f="http://father/">
      <f:name><xsl:value-of select="$p/p:name"/></f:name>
      <f:age><xsl:value-of select="$p/p:age"/></f:age>
      <f:uniqueItemNumber>
        <xsl:value-of select="c:ItemNumber"/>
      </f:uniqueItemNumber>
      <xsl:copy-of select="key('childrenByNumber', concat(generate-id($p), '+', c:ItemNumber))"/>
    </f:father>
  </xsl:for-each>
</xsl:template>
于 2013-10-08T08:39:43.660 に答える