2016-07-06 8 views
0

今はXSLTを使用していますので、子供の値でグループ化する必要があります。私は、複数のプロパティを持つことができ、そのうちの1つ(id = 11)を持つオブジェクトがあり、グループ化要素として使用する必要があります。各オブジェクトが持つことができるプロパティの量はさまざまですが、それらはすべて共通の小道具を持っています。XSLT1.0を使用して子属性を持つXMLをグループ化する

入力:

<object id=1> 
<properties> 
    <prop id=10>Name of object 1</prop> 
    <prop id=11>Group 1</prop> 
    <prop id=xy>Whatever properties this object has</prop> 
</properties> 
</object> 
<object id=2> 
<properties> 
    <prop id=10>Name of object 2</prop> 
    <prop id=11>Group 2</prop> 
</properties> 
</object> 
<object id=3> 
<properties> 
    <prop id=10>Name of object 3</prop> 
    <prop id=11>Group 1</prop> 
</properties> 
</object> 
<object id=4> 
<properties> 
    <prop id=10>Name of object 4</prop> 
    <prop id=11>Group 3</prop> 
</properties> 
</object> 

所望の出力:

<group name='Group 1'> 
    <object id=1> 
    <prop id=10>Name of object 1</prop> 
    <prop id=11>Group 1</prop> 
    <prop id=xy>Whatever properties this object has</prop> 
    </object> 
<object id=3> 
<properties> 
    <prop id=10>Name of object 3</prop> 
    <prop id=11>Group 1</prop> 
</properties> 
</object> 
</group> 
<group name='Group 2'> 
    <object id=2> 
    <properties> 
    <prop id=10>Name of object 2</prop> 
    <prop id=11>Group 2</prop> 
    </properties> 
    </object> 
</group> 
<group name='Group 3'> 
    <object id=4> 
    <properties> 
    <prop id=10>Name of object 4</prop> 
    <prop id=11>Group 3</prop> 
    </properties> 
    </object> 
</group> 

アイデアはID 11

とプロップの値によってグループ化されたアイテムを有することである

アイブは、複数の異なるコードを発見これらのサンプルはこの特定のケースを持っていませんでしたが、私のニーズに合わせて修正することはできませんでした。

+0

ここまでお試しいただいた内容をお見せしましょう。 –

+0

ところで、これはhttp://stackoverflow.com/questions/2291567/how-to-use-xslt-to-create-distinct-valuesとほぼ同じ問題です。 –

答えて

2

Muenchian Methodを使っていましたが、微妙な選択肢を示すために投稿してもいいと思っていました。ここでは、for-each/call-templateの代わりにapply-templatesを使用しています。パフォーマンスに関しては、おそらくそれらの間には何もありませんが、個人的には、柔軟性を高めるために可能な限りapply-templatesを使用することをお勧めします。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="no" encoding="utf-8"/> 
<xsl:key name="groups" match="prop[@id='11']" use="text()"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="//prop[generate-id()=generate-id(key('groups', text())[1])]"/> 
</xsl:template> 

<xsl:template match="prop"> 
    <group name="{text()}"> 
     <xsl:copy-of select="//object[properties/prop[@id='11']=current()/text()]"/> 
    </group> 
</xsl:template> 

</xsl:stylesheet> 
+0

アプライテンプレートはより簡単なオプションのように思えますが、これは完全に機能しました。 – Kemu79

1

これは、(例えば、hereを説明する)Muenchian方法の基本的なアプリケーションである:それはまたであるという点で、本質的にマイケルVehrsとして同じであるXSLのマイバージョン

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

<xsl:key name="prop" match="//prop[@id='11']/text()" use="." /> 

<xsl:template match="/"> 
    <xsl:for-each select="//prop[@id='11']/text()[generate-id() 
         = generate-id(key('prop',.)[1])]"> 
    <xsl:call-template name="group"> 
     <xsl:with-param name="groupname" select="." /> 
    </xsl:call-template> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template name="group"> 
    <xsl:param name="groupname" /> 
    <group><xsl:attribute name="name"><xsl:value-of select='$groupname'/></xsl:attribute> 
    <xsl:for-each select="//object[.//prop[@id='11'][text()=$groupname]]" > 
    <xsl:copy-of select="." /> 
    </xsl:for-each> 
    </group> 
</xsl:template> 

</xsl:stylesheet> 
関連する問題