0

別の標準タイプに変換する必要のあるXMLファイルを取得しています。XSLT2をすぐに使用できますが、どちらのファイルの形式も制御できません。最初のシーケンスには、数値を使用してそれらを一致させる2つのシーケンスがあります。最初のシーケンスは、2番目の0..nを持つことができます。

例は次のとおりです。

入力:

<foo>
<structure name="items">
    <item>
        <itemCode>1</itemCode>
        <itemValue>1111</itemValue>
    </item>
    <item>
        <itemCode>2</itemCode>
        <itemValue>2222</itemValue>
    </item>
</structure>
<structure name="subItems">
    <subItem>
        <itemCode>1</itemCode>
        <subValue>12</subValue>
        <subType>MISC</subType>
    </subItem>
    <subItem>
        <itemCode>1</itemCode>
        <subValue>15</subValue>
        <subType>MISC2</subType>
    </subItem>
    <subItem>
        <itemCode>2</itemCode>
        <subValue>40</subValue>
        <subType>MISC</subType>
    </subItem>
</structure>
</foo>

そして私が欲しい出力は

<bar>
<items>
    <item>
        <code>1</code>
        <value>1111</value>
        <subItems>
            <subItem>
                <subValue>12</subValue>
                <subType>MISC</subType>
            </subItem>
            <subItem>
                <subValue>15</subValue>
                <subType>MISC2</subType>
            </subItem>              
        </subItems>
    </item> 
    <item>
        <code>2</code>
        <value>2222</value>
        <subItems>
            <subItem>
                <subValue>40</subValue>
                <subType>MISC</subType>
            </subItem>
        </subItems>
    </item>         
</items>
</bar>

XSLTプロセッサが次のシーケンスを表示する前に最初のシーケンスを終了したように見えるという理由だけで、item.itemCodeをsubItem.itemCodeにマッピングできませんでした。どちらのシーケンスでいくつ取得するかを知る方法がないため、静的マップを作成できません。

何か案は?

前もって感謝します

4

3 に答える 3

1

適切なサブ値を選択する別の方法は、キーを使用することです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <xsl:key name="subitems-by-code" match="subItem" use="itemCode"/>

  <xsl:template match="foo">
    <bar>
      <items>
        <xsl:apply-templates select="structure[@name='items']"/>
      </items>
    </bar>
  </xsl:template>

  <xsl:template match="item">
    <item>
      <xsl:copy-of select="*"/>
      <subItems>
        <xsl:apply-templates select="key('subitems-by-code', itemCode)"/>
      </subItems>
    </item>
  </xsl:template>

  <xsl:template match="subItem">
    <subItem>
      <xsl:copy-of select="subValue|subType"/>
    </subItem>
  </xsl:template>
</xsl:stylesheet>
于 2012-05-23T18:03:15.153 に答える
0

私は通常、完全な解決策を投稿することに満足していませんが、問題は面白そうだったので、これを書きました。

詳細が必要な場合は、もう一度お問い合わせください。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/foo">
        <bar>
            <items>
                <xsl:apply-templates select="structure[@name='items']/item">
                    <xsl:sort select="itemCode" />
                </xsl:apply-templates>
            </items>
        </bar>
    </xsl:template>

    <xsl:template match="item">

            <item>
                <code>
                    <xsl:value-of select="itemCode" />
                </code>
                <value>
                    <xsl:value-of select="itemValue" />
                </value>
                <subItems>
                    <xsl:apply-templates select="/foo/structure[@name='subItems']/subItem[itemCode=current()/itemCode]" />
                </subItems>
            </item>

    </xsl:template>

    <xsl:template match="subItem">

        <subItem>
            <xsl:copy-of select="subValue"/>
            <xsl:copy-of select="subType"/>
        </subItem>

    </xsl:template>

</xsl:stylesheet>

出力

<?xml version="1.0" encoding="utf-8"?>
<bar>
   <items>
      <item>
         <code>1</code>
         <value>1111</value>
         <subItems>
            <subItem>
               <subValue>12</subValue>
               <subType>MISC</subType>
            </subItem>
            <subItem>
               <subValue>15</subValue>
               <subType>MISC2</subType>
            </subItem>
         </subItems>
      </item>
      <item>
         <code>2</code>
         <value>2222</value>
         <subItems>
            <subItem>
               <subValue>40</subValue>
               <subType>MISC</subType>
            </subItem>
         </subItems>
      </item>
   </items>
</bar>
于 2012-05-23T17:53:41.287 に答える
0

私には、単純なグループ化の問題のように見えます。

<xsl:for-each-group select="items/item, subItems/subItem" group-by="itemCode">
  <item>
    <code><xsl:value-of select="current-group()[self::item]/itemCode"/></code>
    <value><xsl:value-of select="current-group()/itemValue"/></value>
    <subItems>
      <xsl:copy-of select="current-group()[self::subItem]/(subValue, subType)"/>
    </subItems>
  </item>
</xsl:for-each-group>
于 2012-05-23T20:02:51.367 に答える