XSL

2011-03-03 7 views
1

나는이 이미지 데이터를 포함하는 다음과 같은 xml 파일 :XSL

<images> 
<aid>1</aid> 
    <imid>1</imid> 
    <src>img1.jpg</src> 
</images> 
<images> 
<aid>1</aid> 
    <imid>2</imid> 
    <src>img2.jpg</src> 
</images> 
<images> 
<aid>1</aid> 
    <imid>3</imid> 
    <src>img3.jpg</src> 
</images> 
<images> 
<aid>2</aid> 
    <imid>1</imid> 
    <src>img1.jpg</src> 
</images> 
<images> 
<aid>2</aid> 
    <imid>2</imid> 
    <src>img2.jpg</src> 
</images> 
<images> 
etc... 

내가 모든 지원 마지막 IMID 에서 얻을 결과를 제시 하 고 싶습니다 이 예시적인 경우는 같다 :
처치 = 1 IMID = 3 SRC = img3.jpg
처치 = 2 IMID = 2 SRC = img2.jpg

다음 XSL 선택

모든 이미지의 전체 선택에서 나에게 마지막 이미지를 줄 것이다 (원본 파일에서, 지원IMID 's의 많이 포함).
<xsl:for-each select="(/images[aid&gt;=1 and imid])[last()]"> 

다음 XSL 선택

나에게 지원의 모든 첫째 IMID의 결과를 주었다. 내가 그 코드를 조정할 수

<xsl:for-each select="(/images[aid&gt;=1 and imid=1])"> 

방법, 그것은 나에게 모든 지원의 마지막 IMID을 줄 것이다 그래서? XSLT 1.0에서

+0

모든 'aid'에서 마지막 'imid'를 원하지만, 소스 XML이 어떻게 형성되는지는 알 수 없습니다. 입력 내용을 다시 한 번 살펴 보거나 예제를 수정하는 것이 좋습니다. –

+0

좋은 질문입니다, +1. 짧고 쉬운 XSLT 1.0 솔루션에 대한 내 대답을보십시오. :) –

답변

0

는 XSLT 2.0을 사용하는 가정,

<xsl:for-each-group select="//images" group-by="aid"> 
    <xsl:variable name="last" select="current-group()[last()]"/> 
    <out aid="{$last/aid}" imid="{$last/imid}" src="{$last/src}"/> 
</xsl:for-each-group> 
+0

+1 정답 : 각 그룹에 대해 마지막 것을 선택하십시오. –

0

:

<xsl:key name="kImagesByAid" match="images" use="aid"> 
<xsl:variable name="vLastImids" 
    select="/*/images[count(.|key('kImageByAid',aid)[last()])=1]/imid"/> 
0

이 XSLT 1.0 변환 :

<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="kImgByAid" match="images" use="aid"/> 

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

<xsl:template match= 
    "images[not(generate-id() 
      =generate-id(key('kImgByAid',aid)[last()]) 
      ) 
      ]"/> 
</xsl:stylesheet> 

제공된 XML에 적용 문서 (wrapp 상부 요소 ED)이 잘 형성 될 :

<gallery> 
    <images> 
    <aid>1</aid> 
    <imid>3</imid> 
    <src>img3.jpg</src> 
    </images> 
    <images> 
    <aid>2</aid> 
    <imid>2</imid> 
    <src>img2.jpg</src> 
    </images> 
</gallery> 

설명 :

  1. 아이덴티티 규칙 (

    <gallery> 
        <images> 
         <aid>1</aid> 
         <imid>1</imid> 
         <src>img1.jpg</src> 
        </images> 
        <images> 
         <aid>1</aid> 
         <imid>2</imid> 
         <src>img2.jpg</src> 
        </images> 
        <images> 
         <aid>1</aid> 
         <imid>3</imid> 
         <src>img3.jpg</src> 
        </images> 
        <images> 
         <aid>2</aid> 
         <imid>1</imid> 
         <src>img1.jpg</src> 
        </images> 
        <images> 
         <aid>2</aid> 
         <imid>2</imid> 
         <src>img2.jpg</src> 
        </images> 
    </gallery> 
    

    가 원하는 정확한 결과를 생성 템플릿)은 모든 노드를 "있는 그대로"복사합니다.

  2. 해당 그룹의 마지막 요소가 아닌 images 요소를 제외하는 단일 ovverriding 템플리트가 있습니다.

  3. 그룹화는 고전적인 Muenchian 방법을 사용하여 구현됩니다.