2013-03-16 2 views
1

영화와 해당 액터를 저장하는 XML 파일이 있습니다.XPath 1.0을 사용하여 특성을 기반으로 고유 한 요소 값을 선택하십시오.

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="index.xsl"?> 
<movies 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="movies.xsd"> 

<movie movieID="1"> 
    <actors> 
     <actor actorID="1"> 
      <name link="hello">Bob</name> 
     </actor> 

     <actor actorID="2"> 
      <name link="hello">Mike</name> 
     </actor> 
    </actors> 
</movie> 

<movie movieID="2"> 
    <actors> 
     <actor actorID="1"> 
      <name link="hello">Bob</name> 
     </actor> 

     <actor actorID="2"> 
      <name>Daniel</name> 
     </actor> 
    </actors> 
</movie> 

</movies> 

위의 코드에서 알 수 있듯이 각각 2 개의 "액터"하위 요소가 포함 된 2 개의 "동영상"요소가 있습니다. 4 개의 "name"자식 요소 중 3 개가 "link"특성을 포함합니다. Bob, Mike, Bob

속성 "link"가 포함 된 액터의 이름 만 표시하려면 다음 XSLT 코드를 사용하고 있습니다.

<xsl:template match="/"> 
    <xsl:text>Actors: </xsl:text> 
    <xsl:apply-templates select="/movies/movie/actors/actor/name[@link]"/> 
</xsl:template> 

<xsl:template match="name[@link]"> 
    <xsl:value-of select="." /> 
    <xsl:element name="br" /> 
</xsl:template> 

내가 얻을 출력 :

Bob 
Mike 
Bob 

당신은 이름이 "밥"을 볼 수 있듯이 두 번 반복합니다.

<xsl:template match="[not(@name[@link] = preceding::@name)]"> 

<xsl:template match="not(@name[@link] = preceding::@name)"> 

<xsl:template match="not(@name[@link] = preceding-sibling::@name)"> 

그들 모두는 페이지가 오류를 표시했다 : 나는 다음의 XPath 1.0 쿼리를 시도

속성 "링크"에만 고유 한 배우의 이름을 표시합니다.

답변

2

XSLT 1.0에서 다음과 같이 그룹화 할 수있는 효율적인 방법이 Muenchian 그룹을 사용하는 것입니다 (내가 추가 한 div 및 선명도에 대한 br, 그들을 제거 주시기 바랍니다) :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:key name="kName" match="actor/name[@link]" use="." /> 

    <xsl:template match="/"> 
    <div> 
     <xsl:text>Actors: </xsl:text> 
     <br /> 
     <xsl:variable name="actorNames" 
        select="/movies/movie/actors/actor/name[@link]"/> 
     <xsl:apply-templates 
        select="$actorNames[generate-id() = 
             generate-id(key('kName', .)[1])]" /> 
    </div> 
    </xsl:template> 

    <xsl:template match="name"> 
    <xsl:value-of select="." /> 
    <br /> 
    </xsl:template> 
</xsl:stylesheet> 

에 실행하는 경우 샘플을 입력하면 다음과 같이 표시됩니다.

<div> 
    Actors: <br />Bob<br />Mike<br /> 
</div> 
+0

완벽합니다. 고유 한 요소를 정의하는보다 효율적인 방법을 알고 있으면 좋습니다. 고맙습니다! – Alex

관련 문제