フラットXMLドキュメントからネストされたXMLドキュメントを作成しようとしています。ここで、ネット上で利用可能な他のリソースを検索した後、muenchainメソッドが解決策になるかもしれないと思われますが、私は自分の状況にそれを適用するのに苦労しています。XLSTでmuenchianメソッドを使用してネストされたXMLを生成する
私は翻訳する必要がXMLの形式は次のとおりです。
<i>
<item id="1" name="one" sub_id="10" sub_name="s1" detail_id="t1" detail_name="aaaa"/>
<item id="1" name="one" sub_id="10" sub_name="s1" detail_id="t2" detail_name="bbb"/>
<item id="1" name="one" sub_id="20" sub_name="s2" detail_id="t1" detail_name="ccc"/>
<item id="1" name="one" sub_id="20" sub_name="s2" detail_id="t2" detail_name="ddd"/>
<item id="2" name="two" sub_id="10" sub_name="s1" detail_id="t1" detail_name="eee"/>
<item id="2" name="two" sub_id="10" sub_name="s1" detail_id="t2" detail_name="fff"/>
<item id="2" name="two" sub_id="20" sub_name="s2" detail_id="t1" detail_name="ggg"/>
<item id="2" name="two" sub_id="20" sub_name="s2" detail_id="t2" detail_name="hhh"/>
<item id="3" name="three" />
<item id="4" name="four" sub_id="10" sub_name="s1" detail_id="t1" detail_name="mmm"/>
<item id="4" name="four" sub_id="10" sub_name="s1" detail_id="t2" detail_name="nnn"/>
<item id="4" name="four" sub_id="20" sub_name="s2" detail_id="t1" detail_name="ooo"/>
<item id="4" name="four" sub_id="20" sub_name="s2" detail_id="t2" detail_name="ppp"/>
</i>
私は、次の形式でXMLにこれをtranformしたいと思います:
<i>
<item id="1" name="one" sub_items="true">
<sub_item sub_id="10" sub_name="s1">
<detail detail_id="t1" detail_name="aaaa"/>
<detail detail_id="t2" detail_name="bbb"/>
</sub_item>
<sub_item sub_id="20" sub_name="s2">
<detail detail_id="t1" detail_name="ccc"/>
<detail detail_id="t2" detail_name="ddd"/>
</sub_item>
</item>
<item id="2" name="two" sub_items="true">
<sub_item sub_id="10" sub_name="s1">
<detail detail_id="t1" detail_name="eee"/>
<detail detail_id="t2" detail_name="fff"/>
</sub_item>
<sub_item sub_id="20" sub_name="s2">
<detail detail_id="t1" detail_name="ggg"/>
<detail detail_id="t2" detail_name="hhh"/>
</sub_item>
</item>
<item id="3" name="three" sub_items="false"/>
<item id="4" name="four" sub_items="true">
<sub_item sub_id="10" sub_name="s1">
<detail detail_id="t1" detail_name="mmm"/>
<detail detail_id="t2" detail_name="nnn"/>
</sub_item>
<sub_item sub_id="20" sub_name="s2">
<detail detail_id="t1" detail_name="ooo"/>
<detail detail_id="t2" detail_name="ppp"/>
</sub_item>
</item>
</i>
私の研究から、私は次のXLSTを持っています変換を実行します。 item id属性のkeyメソッドを使用します。これは、各レベルで指定されたアイテムIDのすべてを繰り返すデータを正しくグループ化するわけではありません。だから私の問題は、どのように私は別のキーステートメントを使用する必要がある各ネストレベルを出力するために必要なノードを選択するに行くのですか?
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="indexes" match="i/item" use="@id"/>
<xsl:template match="i">
<i>
<xsl:for-each select="item[count(. | key('indexes',@id)[1]) = 1]" >
<xsl:sort select="@id"/>
<item>
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:attribute name="name">
<xsl:value-of select="@name"/>
</xsl:attribute>
<xsl:attribute name="hasRows">
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:for-each select="key('indexes',@id)">
<subitem>
<xsl:attribute name ="sub_id">
<xsl:value-of select="@sub_id"/>
</xsl:attribute>
<xsl:attribute name ="sub_name">
<xsl:value-of select="@sub_name"/>
</xsl:attribute>
<xsl:for-each select="key('indexes',@id)">
<segment>
<xsl:attribute name ="detail_id">
<xsl:value-of select="@detail_id"/>
</xsl:attribute>
<xsl:attribute name ="detail_name">
<xsl:value-of select="@detail_name"/>
</xsl:attribute>
</segment>
</xsl:for-each>
</subitem>
</xsl:for-each>
</item>
</xsl:for-each>
</i>
</xsl:template>
</xsl:stylesheet>
また、それはそうではないときの項目のサブ項目/詳細が存在し、偽とき真で* sub_items *属性を移入することは可能でしょうか?
最後に、XSLTの理解とスキルを向上させるために、誰もが良い学習リソースを推薦できますか?
をあなたがここに少しの努力を必要とし、複数のレベルでのグループ化のmeunchanメソッドを使用します。あなたはこの例からインスピレーションを得ようとすることができます(http://stackoverflow.com/questions/6346740/xsl-to-create-folders-based-on-attribute/6349141#6349141)、またはインターネットで " xslt meunhcan "またはここで熱狂的な回答者の誰かを待つ。 –
+1本当に良い質問。 –
AVTとテンプレートモードで人生を簡単にする方法について私の答えを見てください。 –