2013-07-22 2 views
1

내 요구 사항은 @guid이 관계 @relationObj 중 하나와 일치하는 관계 태그를 삭제하는 것입니다. 여기에서 <roleCode tc=32> 또는 <roleCode tc=31> 또는 <roleCode tc=8> 중 하나와 일치해야합니다. 위 로직은 @relationObj 중 하나와 일치해야하는 @relationObj에도 적용됩니다. 여기에서 <roleCode tc=32> 또는 <roleCode tc=31> 또는 <roleCode tc=8> 인 경우에만 일치해야합니다.검색 조건을 기반으로 섹션 삭제

기본적으로 내가 @relationObj<roleCode tc=32> 또는 <roleCode tc=31> 또는 <roleCode tc=8>에 속하는 경우 다른 관계 태그를보고 @guid@relationObj를 검색 할 수 있습니다. 이 조건이 참이면이 섹션을 삭제하십시오.

<Relations> 
<Relation guid="abcd1234" relationObj="1234"> 
    <roleCode tc="20"/> 
</Relation> 
<Relation guid="xyz123" relationObj="1111"> 
    <roleCode tc="32"/> 
</Relation> 

<Relation guid="def123" relationObj="2222"> 
    <roleCode tc="31"/> 
</Relation> 

<Relation guid="1111" relationObj="2222"> 
    <roleCode tc="98"/> 
</Relation> 

<Relation guid="jkl123" relationObj="3333"> 
    <roleCode tc="8"/> 
</Relation> 

<Relation guid="2222" relationObj="1234"> 
    <roleCode tc="100"/> 
</Relation> 
</Relations> 

내가 템플릿 내부의 각 <roleCode tc>[32,31 and 8]에 대한 @relationObj를 추출하는 세 가지 변수를 만들려고 : 아래

은 XML이다. 그런 다음 @objectId@relationObj을이 세 변수와 비교합니다. 하지만 여기서 문제는 iterating하는 동안 다른 <Relation> 태그를 만나면 변수가 빈 값으로 업데이트되는 것입니다.

위의 XML에서 변환 후 xml 이하가되어야합니다. 당신이 관찰하는 경우

<Relations> 
<Relation guid="abcd1234" relationObj="1234"> 
    <roleCode tc="20"/> 
</Relation> 
<Relation guid="xyz123" relationObj="1111"> 
    <roleCode tc="32"/> 
</Relation> 

<Relation guid="def123" relationObj="2222"> 
    <roleCode tc="31"/> 
</Relation> 
<Relation guid="jkl123" relationObj="3333"> 
    <roleCode tc="8"/> 
</Relation> 
<Relation guid="2222" relationObj="1234"> 
    <roleCode tc="100"/> 
</Relation> 
</Relations> 

, 함께 <Relation> 태그 [GUID = "1111"relationObj는 = "2222"가] 삭제됩니다. @guid와 @relationObj는 모두 roleCodes - 32,31 또는 8 중 하나에 속하기 때문에.

새 변수로 업데이트하지 않고 변수의 값을 저장하는 것이 가장 좋은지 알려 주시기 바랍니다. 또는 나는 이것을 달성 할 수있는 더 좋은 접근법이있다. 시간 내 주셔서 감사합니다.

답변

1

나는 특정 relationObj에 대한 모든 roleCode 값을 추출하게 한 다음 제외 할 Relation 요소를 선택하는 그 키를 사용하는 을 정의하여이 문제를 접근하는 것입니다. 내가 제대로 다음 요구 사항을 이해한다면 난이 일을해야한다고 생각 :

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

    <xsl:key name="roleCodeByRelObj" match="roleCode" use="../@relationObj" /> 

    <!-- copy input to output except where more specific template applies --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 

    <!-- ignore any Relation whose guid and relationObj match the relationObj of a 
     Relation whose roleCode/@tc is 8, 31 or 32 (not necessarily the same 
     matching Relation in both cases) --> 
    <xsl:template match="Relation[ 
     (
     (key('roleCodeByRelObj', @guid)/@tc = '8') or 
     (key('roleCodeByRelObj', @guid)/@tc = '31') or 
     (key('roleCodeByRelObj', @guid)/@tc = '32') 
     ) 
    and 
     (
     (key('roleCodeByRelObj', @relationObj)/@tc = '8') or 
     (key('roleCodeByRelObj', @relationObj)/@tc = '31') or 
     (key('roleCodeByRelObj', @relationObj)/@tc = '32') 
     ) 
    ]" /> 

</xsl:stylesheet> 

방법 평등 테스트는 XPath를 작동 한쪽 노드 집합 테스트가 사실이라고되어있을 때 경우 세트의 노드 어떤 값과 일치합니다. 따라서

key('roleCodeByRelObj', @guid)/@tc = '31' 

guid

은 "2222"두 roleCode 요소 다시 키 기능 ( tc=31tc=98)에서 얻을, 그 중 하나가 목표 값과 일치하므로 전체 테스트가 성공합니다.

+0

감사합니다. xslt 위에 적용하면 마지막 관계 태그 [guid = "2222"relationObj = "1234"]는 삭제하면 안됩니다. @ relationObj = "1234"는 조건에없는 roleCode 20에 속하기 때문에. 내 업데이트 된 출력 XML을 참조하십시오. –

+0

원래 질문에서 @MadhuCM 당신은 2222/1234 관계가 삭제되어야한다고 말했습니까? 이제는 'guid'와 'relationObj'가 'roleCode'가 세 가지 중 하나 인 'Relation/@ relationObj'와 일치하는 관계 만 삭제하도록 요구 사항을 변경하고 있습니까? –

+0

마지막 관계의 @ guid = "2222"는 roleCode 31에 속하지만 @relObj = "1234"는 roleCodes (32,31 또는 8)에 속하지 않습니다. 따라서 기본적으로 AND 조건을 사용하여 관계 섹션을 삭제해야합니다. –

관련 문제