2013-04-02 4 views
2

모든 "object_name"에서 "item_revision_id"의 ​​최대 값을 취하는 xsl이 필요합니다. 원하는 출력xslt 그룹 최대 값 선택

<?xml version="1.0" encoding="Windows-1252"?> 
    <rows> 
    <row> 
     <row_element property_name="object_name">pluto</row_element> 
     <row_element property_name="description">description of version 01</row_element> 
     <row_element property_name="item_revision_id">01</row_element> 
    </row> 
    <row> 
     <row_element property_name="object_name">pippo</row_element> 
     <row_element property_name="description">description of version 02</row_element> 
     <row_element property_name="item_revision_id">02</row_element> 
    </row> 
</rows> 

이다

<rows> 
    <row> 
     <row_element property_name="object_name">pluto</row_element> 
     <row_element property_name="description">description of version 00</row_element> 
     <row_element property_name="item_revision_id">00</row_element> 
    </row> 
    <row> 
     <row_element property_name="object_name">pluto</row_element> 
     <row_element property_name="description">description of version 01</row_element> 
     <row_element property_name="item_revision_id">01</row_element> 
    </row> 
    <row> 
     <row_element property_name="object_name">pippo</row_element> 
     <row_element property_name="description">description of version 02</row_element> 
     <row_element property_name="item_revision_id">02</row_element> 
    </row> 
    <row> 
     <row_element property_name="object_name">pippo</row_element> 
     <row_element property_name="description">description of version 00</row_element> 
     <row_element property_name="item_revision_id">00</row_element> 
    </row> 
</rows> 

이 입력으로부터 ........ I는 혼합 값을 새로 작성하지 최대 행 요소를 얻으려면

<?xml version="1.0" encoding="Windows-1252"?> 
<rows> 
    <row><!-- this is right --> 
     <row_element property_name="object_name">pluto</row_element> 
     <row_element property_name="description">description of version 01</row_element> 
     <row_element property_name="item_revision_id">01</row_element> 
    </row> 
    <row><!-- this is wrong --> 
     <row_element property_name="object_name">pippo</row_element> 
     <row_element property_name="description">description of version 00</row_element> 
     <row_element property_name="item_revision_id">02</row_element> 
    </row> 
</rows> 

어떤 도움이 필요합니까?

답변

1

이 변환 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kRowByObjName" match="row" use="*[@property_name='object_name']"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
"row[not(generate-id() 
     = 
      generate-id(key('kRowByObjName', *[@property_name='object_name'])[1]) 
     )]"/> 

<xsl:template match="*[@property_name='item_revision_id']/text()"> 
    <xsl:for-each select="key('kRowByObjName', ../../*[@property_name='object_name'])"> 
    <xsl:sort select="*[@property_name='item_revision_id']" 
      data-type="number" order="descending"/> 
    <xsl:if test="position()=1"> 
    <xsl:value-of select="*[@property_name='item_revision_id']"/> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
제공된 XML 문서에 적용

:

<rows> 
    <row> 
     <row_element property_name="object_name">pluto</row_element> 
     <row_element property_name="item_revision_id">01</row_element> 
    </row> 
    <row> 
     <row_element property_name="object_name">pippo</row_element> 
     <row_element property_name="item_revision_id">02</row_element> 
    </row> 
</rows> 
01,235 :

<rows> 
    <row> 
     <row_element property_name="object_name">pluto</row_element> 
     <row_element property_name="item_revision_id">00</row_element> 
    </row> 
    <row> 
     <row_element property_name="object_name">pluto</row_element> 
     <row_element property_name="item_revision_id">01</row_element> 
    </row> 
    <row> 
     <row_element property_name="object_name">pippo</row_element> 
     <row_element property_name="item_revision_id">02</row_element> 
    </row> 
    <row> 
     <row_element property_name="object_name">pippo</row_element> 
     <row_element property_name="item_revision_id">00</row_element> 
    </row> 
</rows> 

가 원하는 정확한 결과 생산


II. XSLT 2.0 솔루션 :

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kRowByObjName" match="row" use="*[@property_name='object_name']"/> 

<xsl:template match="/*"> 
    <rows> 
    <xsl:for-each-group select="row" group-by="*[@property_name='object_name']"> 
     <row> 
     <xsl:sequence select="*[@property_name='object_name']"/> 
     <xsl:sequence select= 
     "current-group() 
      /*[@property_name='item_revision_id' 
      and 
      . = max(current-group()/*[@property_name='item_revision_id']/number()) 
      ]"/> 
     </row> 
    </xsl:for-each-group> 
    </rows> 
</xsl:template> 
</xsl:stylesheet> 
+0

대단히 감사드립니다. – user2217858

+0

나는 올바른 질문을하지 않았다는 것을 설명하는 부작용을 봅니다. : – user2217858

+0

나는 올바른 질문을하지 않았다는 것을 설명하는 부작용을 봅니다. : 나는 가장 높은 "질문"을 가지고있는 ""을 "선택"하고 싶었습니다. item_revision_id ".property_name = descritption을 가진 또 다른 row_element를 가지고있는 경우 결과에서 때때로 최신 개정판에서 복사 된 것을 복사하지 않음을 확인했습니다. 내가 어떻게 대처할 수 있니? – user2217858