2013-08-15 3 views
1

xslt 1.0을 사용하고 있으며 노드 집합 함수를 사용해야한다는 두 변수의 조합이 필요합니다.두 개의 노드 집합 결과가 결합되어 중복 된 집합 구성원이됩니다.

아래의 테스트 사례는이 노드를 포함하는 집합을 가진 단일 노드의 공용체를 만듭니다. A가 B를 포함하기 때문에, 조합 연산은 B를 반환해야합니다. 그러나 중복 된 A를 가진 새로운 세트를 얻습니다.

xpath를 직접 사용하면 공용체가 예상대로 작동합니다. 변수와 노드 집합 함수를 사용하면 예기치 않은 상황에 직면하게됩니다. 내 시나리오에서는 노드 집합을 사용해야합니다. 내가 할 수있는만큼 테스트 케이스를 단순화했다.

이 XML 내용이다 :

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <event> 
    <id>3</id> 
    <eventType>TYPE1</eventType> 
    </event> 
    <event> 
    <id>2</id> 
    <eventType>TYPE2</eventType> 
    <parent>3</parent> 
    </event> 
    <event> 
    <id>1</id> 
    <eventType>TYPE2</eventType> 
    <parent>3</parent> 
    </event> 
</root> 

이는 XSLT이다 :

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:ext="http://exslt.org/common" 
       exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/">  

     <xsl:variable name="t2-events"> 
     <xsl:copy-of 
      select="root/event 
        [eventType = 'TYPE2' and parent = '3']"/> 
     </xsl:variable> 

     <xsl:variable name="specific-t2"> 
      <xsl:copy-of 
      select="root/event 
        [eventType = 'TYPE2' and id = '2']"/>   
     </xsl:variable> 

     <DEBUG>   

      <results>    
      <xsl:variable name="dummy" 
          select="root/event 
            [eventType = 'TYPE2'] 
            | 
            root/event[id = '2']"/> 
      <xsl:variable name="dummy2" 
          select="ext:node-set($t2-events) 
           | ext:node-set($specific-t2) "/> 

      <xsl:comment>Works as expected</xsl:comment> 
      <dummy>    
       <xsl:copy-of select="$dummy"/> 
      </dummy> 
      <dummy2> 
       <xsl:comment>There are 3 elements here, where we should have 2</xsl:comment> 
       <xsl:copy-of select="$dummy2"/> 
      </dummy2>    
      </results> 

     </DEBUG>    
    </xsl:template> 
</xsl:stylesheet> 

가 어떻게 노드 집합()가 호출이에 노조를 적용합니까?

답변

0

node-set()이 여기서 발생하지 않는다고 생각합니다.

xsl : copy-of를 사용하여 t2-eventsspecific-t2 변수를 정의했습니다. 따라서 변수에는 xsl : copy-of의 select식이 선택한 노드의 새로운 복사본 (새 요소 노드)이 포함되어야합니다. 두 변수의 event 요소 중 어느 것도 입력의 event 요소와 동일하지 않으며 두 변수에서 작성된 이벤트 2의 두 복사본이 단일 복사본에 대한 두 개의 참조가 아니라 두 개의 복사본이라는 점에 유의하십시오.

디버깅 코드에 몇 가지 변수를 추가하면 (예를 들어, 아래의 예제를 멋지게 정리해라!) node-set()을 사용하든 사용하지 않든 관계없이 union은 예상대로 발생합니다 아니. 당신의 DEBUG 요소 내에 다음

<xsl:variable name="T2-EVENTS" 
       select="root/event 
         [eventType = 'TYPE2' and parent = '3']"/> 
<xsl:variable name="SPECIFIC-T2" 
       select="root/event 
         [eventType = 'TYPE2' and id = '2']"/>   

, 내가 추가 :

<xsl:variable name="dummy3" 
       select="$T2-EVENTS | $SPECIFIC-T2 "/> 
<xsl:variable name="dummy4" 
       select="ext:node-set($T2-EVENTS) 
        | ext:node-set($SPECIFIC-T2) "/> 

<dummy3> 
    <xsl:comment>How many here?</xsl:comment> 
    <xsl:copy-of select="$dummy3"/> 
</dummy3> 
<dummy4> 
    <xsl:comment>How many here?</xsl:comment> 
    <xsl:copy-of select="$dummy4"/> 
</dummy4> 
을 (. xsltproc에서 적어도) 당신의 처음 두 변수 후

, 나는 두 개 더 추가

결과 스타일 시트를 xsltproc과 함께 실행하면 dummy3과 2의 dummy4; node-set()에 대한 호출은 아무런 차이를 만들지 않았다.

(즉, 나는 그래서 그것을 어느 쪽이든 의존하는 의심이 될 것입니다. 노드 집합()을 보존 노드 ID를 보존 여부에 대해 아무것도 말한다 the description of the node-set() function on the EXSLT site에서 아무것도 볼 수있다.)

+0

감사합니다. 나는 이것이 내가 가진 문제라고 생각한다 : 나의 원래 코드는 또한 xsl : copy-of를 사용한다. 내 코드를 사용하여 사본을 제거 할 수 있는지 확인합니다. – mahonya