2016-06-23 2 views
0

저는 XSLT의 초보자이며 코드에서 참조 된 요소 위치에 따라 다른 노드를 참조하는 노드를 제거하려는 경우를 어떻게 해결해야할지 모릅니다.참조 요소를 반복적으로 제거하십시오.

다음은 간단하고 기본적인 예입니다 (구문이 정확하지 않을 수 있음). 소스는 다음과 같습니다

<nodeTypeA id=0> 
    <nodeTypeB id="1">lorem ipsum</nodeTypeB> 
    <nodeTypeC id="2"> 
    <nodeTypeD id="3">D1</nodeTypeD> 
    <nodeTypeE id="4">D2</nodeTypeE> 
    <nodeTypeF id="5">D2</nodeTypeF> 
    </nodeTypeC> 
    <nodeTypeC id="6"> 
    <nodeTypeD id="7">D1</nodeTypeD> 
    <nodeTypeE id="8">D2</nodeTypeE> 
    <nodeTypeF id="9">D2</nodeTypeF> 
    </nodeTypeC> 
</nodeTypeA> 
<nodeType1 id="a"> 
    <nodeType2 id="b" ref="5">lorem ipsum</nodeType2> 
    <nodeType3 id="c" ref="2">lorem ipsum</nodeType3> 
    <nodeType4 id="d" ref="1">lorem ipsum</nodeType4> 
    <nodeType5 id="e" ref="3">lorem ipsum</nodeType5> 
    <nodeType6 id="f" ref="4">lorem ipsum</nodeType6> 
    <nodeType2 id="g" ref="6">lorem ipsum</nodeType2> 
    <nodeType3 id="h" ref="7">lorem ipsum</nodeType3> 
    <nodeType5 id="i" ref="8">lorem ipsum</nodeType5> 
    <nodeType6 id="j" ref="9">lorem ipsum</nodeType6>   
</nodeType1> 

내 목표는 nodeTypeC 노드의 모든 자식 (즉, IDS 2 & 6있는 사람)들 제거 아이를 참조 nodeType1에서뿐만 아니라 노드 (즉, IDS 3, 4 제거하는 것입니다, 5, 7, 8, 9). 그래서 ids e, f, b, h, i, j 노드를 제거하고 싶습니다. 그 결과 일부 XML은 다음과 같습니다

<nodeTypeA id=0> 
    <nodeTypeB id="1">lorem ipsum</nodeTypeB> 
    <nodeTypeC id="2"></nodeTypeC> 
    <nodeTypeC id="6"></nodeTypeC> 
</nodeTypeA> 
<nodeType1 id="a"> 
    <nodeType3 id="c" ref="2">lorem ipsum</nodeType3> 
    <nodeType4 id="d" ref="1">lorem ipsum</nodeType4> 
    <nodeType2 id="g" ref="6">lorem ipsum</nodeType2>   
</nodeType1> 

나는 XSLT에 완전히 새로운, 그래서 대답은 당신에게 사소한 보일 수도 ... 여러분의 도움에 감사드립니다!

+0

당신은 "nodeTypeC는 노드 * * 아이를 모두 제거"라고 -하지만 분명히 당신은 또한'nodeTypeC' 노드를 제거하려면 그들 자신? –

답변

0

지정하시오

<xsl:key name="ref" match="nodeTypeC/*" use="@id"/> 

다음 세 템플릿 물품이 가장 먼저

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

번째 nodeTypeC

<xsl:template match="nodeTypeC/*"/> 

및 제 아이들 제거 항등 변환이다 키 참조 요소

<xsl:template match="nodeType1/*[key('ref', @ref)]"/> 

물론 당신에게 마지막 두 템플릿을 결합 할 수있는 단일 한

<xsl:template match="nodeTypeC/* | nodeType1/*[key('ref', @ref)]"/> 
+0

대답 주셔서 감사합니다, 그것은 확실히 내 질문을 해결합니다! – Quentin

관련 문제