2009-07-23 3 views
3

문서에서 고유 노드를 선택하는 방법에 대해 다른 질문을 읽었지만 (Muenchian 메서드 사용) 내 경우에는 키를 사용할 수 없습니다. how) 노드 집합에서 작업 중이기 때문에 문서에 있지 않습니다.XSL : 노드 집합에서 고유 한 노드를 선택하는 방법

키를 노드 집합에 설정할 수 없습니다. 자신이 <structure> 요소를 포함 <deviceInstance> 노드가 포함

<xsl:variable name="limitedSet" select=" 
    $deviceInstanceNodeSet[position() &lt;= $tableMaxCol]" 
/> 

이 노드 집합 이런 식으로 표현 될 수

: 기본적으로 나는 변수가

<deviceInstance name="Demux TSchannel" deviceIndex="0"> 
    <structure name="DemuxTschannelCaps"> 
    </structure> 
</deviceInstance> 
<deviceInstance name="Demux TSchannel" deviceIndex="1"> 
    <structure name="DemuxTschannelCaps"> 
    </structure> 
</deviceInstance> 
<deviceInstance name="Demux TSchannel" deviceIndex="3"> 
    <structure name="otherCaps"> 
    </structure> 
</deviceInstance> 

을 그리고 <structure> 요소를 선택하기를 모르는 이름 만 다릅니다. $limitedSet

<structure name="DemuxTschannelCaps"></structure> 
<structure name="otherCaps"></structure> 

내가

select="$limitedSet//structure[not(@name=preceding::structure/@name)]" 

을 시도했지만 앞의 축이 모든 문서를 따라 이동하지 : 선택이 예제에있는 두 개의 <structure> 요소를 반환?

나는 붙어있어, 누군가 나를 도울 수 있나. 고맙습니다.

답변

3
<xsl:variable name="structure" select="$limitedSet//structure" /> 

<xsl:for-each select="$structure"> 
    <xsl:variable name="name" select="@name" /> 
    <xsl:if test="generate-id() = generate-id($structure[@name = $name][1])"> 
    <xsl:copy-of select="." /> 
    </xsl:if> 
</xsl:for-each> 

이것은 키에 의해 도움을받을 수있다 :

<xsl:key name="kStructureByName" match="structure" use=" 
    concat(ancestor::device[1]/@id, ',', @name) 
" /> 
<!-- ... --> 
<xsl:variable name="name" select="concat(ancestor::device[1]/@id, ',', @name)" /> 
<xsl:if test="generate-id() = generate-id(key('kStructureByName', $name)[1])"> 
+0

이가있다 :

<xsl:key name="kStructureByName" match="structure" use="@name" /> <!-- ... --> <xsl:if test="generate-id() = generate-id(key('kStructureByName', $name)[1])"> 

귀하의 의견에 따라, 키는 몇 가지 추가 상황에 맞는 정보를 수집해야 내 하루를 절약 할 수있는 훌륭한 답변, 빠른 답장을 보내 주셔서 감사합니다. 이 사이트는 훌륭하며이 답변에 순위를 매기도록 등록 할 것입니다. Tahnk 너무 많이. SeB. – SeB

+0

당신의 핵심 제안에 대한 생각을했지만, 여러 장치 중에서 하나의 구조체가 필요하고 제안이 단일 장치에서만 작동하기 때문에 이것이 작동하지 않습니다. – SeB

+0

@SeB : 무슨 뜻인지 모르시겠습니까? 제 제안 (적어도 두 번째 버전의 키)은 여러 장치에서 작동합니다. 물론 "사용"표현을 실제 XML에 적용해야하지만 불가능하지 않아야합니다. – Tomalak

1
select="$limitedSet//structure[not(@name=preceding::structure[count($limitedSet) = count($limitedSet | ..)]/@name)]" 
+0

내가 말했듯이, axi applis는 모든 문서에 적용되고 nodeset에는 적용되지 않습니다. 게다가 내 형제 자매는 다른 장치로 이동하지 않습니다. 하나의 구조가 들어 있습니다. 하지만 어쨌든 시도해 주셔서 감사합니다. – SeB

+0

'preceding'와'following' 축은 모든 문서에 적용되지만'preceding-sibling'과'following-sibling'은 같은 부모를 가진 노드에만 적용됩니다. 당신은 다른'deviceInstance' 엘리먼트의 노드를 고려하지 않는 것이 옳습니다. –

+0

업데이트 된 버전을 사용해보십시오. '$ limitedSet'에있는 노드의 존재를 테스트하기 위해 해킹을해야했습니다. –

관련 문제