2013-05-20 3 views
1

를 사용하여 내가이 final.xml 여기필터 트리 XSLT

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="b.xsl"?> 
<childrens> 
<child_1 entity_id="1" value="Root Catalog" parent_id="0"> 
    <child_2 entity_id="2" value="Navigate" parent_id="1"> 
     <child_4 entity_id="4" value="Activities" parent_id="2"> 
      <child_10066 entity_id="10066" value="Physical1" parent_id="4"> 
       <child_10067 entity_id="10067" value="Cricket" parent_id="10066"> 
        <child_10068 entity_id="10068" value="One Day" parent_id="10067"/> 
       </child_10067> 
      </child_10066> 
      <child_10069 entity_id="10069" value="Test2" parent_id="4"/> 
      <child_10070 entity_id="10070" value="Test3" parent_id="4"/> 
      <child_10071 entity_id="10071" value="Test4" parent_id="4"/> 
      <child_10072 entity_id="10072" value="Test5" parent_id="4"/> 
      <child_5 entity_id="5" value="Physical" parent_id="4"/> 
     </child_4> 
     <child_4331 entity_id="4331" value="Region" parent_id="2"> 
      . 
      . 
      . 
      . 
     </child_4331> 
    </child_2> 
</child_1> 
</childrens> 

같은 트리 구조의 XML 파일이 나의 XSLT 코드

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="*" mode="item"> 
     <li> 
      <xsl:value-of select="@value"/> 
      <xsl:apply-templates select="current()[*]"/> 
     </li> 
</xsl:template> 

    <xsl:template match="*/*/*"> 
    <ul> 
     <xsl:apply-templates select="*[1] | node()[current()/ancestor::*[3]]" mode="item"/> 
    <xsl:if test="local-name(child::*) = 'child_4'"><div id="Activity"></div></xsl:if> 
    </ul> 
    </xsl:template> 
</xsl:stylesheet> 

하고 난의 ID를 포함하는 다른 XML 파일이 리프 노드 은 내가 (부모 ID로) filter.xml 파일에 있습니다 만 노드

을 표시 할과 filter.xml는

입니다

여기 dist_activity는 기본 xml 파일의 entity_id 인 리프 노드의 ID를 포함하므로이 2 xml 파일을 사용하여 출력하고 싶습니다. 현재 난 단지 주 XML 파일을 여기하지 filter.xml 파일을 사용하고하는 것은 내가 어느 날 (10068), Test2를위한

여기 enter image description here

이 filter.xml에 모두 파일을 사용하여 원하는 내 전류 출력 및 넣어 밖으로 (10069), test3 (10070), Physical (5) 그래서 내 나무에있는 사람들 만 필요합니다.

xslt 코드에서 변경해야 할 사항은 무엇입니까 ???

답변

1

필자는 필터가 어떻게 작동해야하는지 완전히 명확하지 않습니다. 귀하의 진술에서 :
여기에 1 일 (10068), Test2 (10069), test3 (10070), Physical (5)에 대한 filter.xml에 내 나무에만 그 사람을 원합니다
및 filter.xml 예상 : child_xxxx 요소의 출력에 li 요소를 갖고 싶은데, self 또는 descendant의 entity_id가 filter.xml에 dist_activity의 @value로 존재합니다.

따라서 귀하의 XLST이 작은 변화를 시도 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/> 

    <xsl:variable name="filter" select="document('iz1_filter.xml')"/> 

    <xsl:template match="*" mode="item"> 
     <xsl:if test="$filter//dist_activity[@value= current()/descendant-or-self::*/@entity_id ]" > 
      <li> 
       <xsl:value-of select="@value"/> 
       <xsl:apply-templates select="current()[*]"/> 
      </li> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="*/*/*"> 
     <ul> 
      <xsl:apply-templates select="*[1] | node()[current()/ancestor::*[3]]" mode="item"/> 
      <xsl:if test="local-name(child::*) = 'child_4'"> 
       <div id="Activity"></div> 
      </xsl:if> 
     </ul> 
    </xsl:template> 
</xsl:stylesheet> 

가 어느 다음과 같은 출력을 생성합니다 : 내가 usnig 출력을 원하는

<ul> 
    <li> 
     Activities<ul> 
      <li> 
       Physical1<ul> 
        <li> 
         Cricket<ul> 
          <li>One Day</li> 
         </ul> 
        </li> 
       </ul> 
      </li> 
      <li>Test2</li> 
      <li>Test3</li> 
      <li>Physical</li> 
     </ul> 
    </li> 
    <div id="Activity"></div> 
</ul> 
0

node()[current()/ancestor::*[3]]은 3 개 이상의 조상이있는 모든 하위 노드를 선택합니다. 현재 노드에는 두 개의 부모가 있으므로 모든 자식 모두 모두 3 개의 조상을가집니다.

이전 형제가 세 개인 형을 선택한 경우 ancestor 축이 아닌 preceding-sibling 축을 사용해보십시오.

+0

을' –

+0

내가 코드를 가질 수 filter.xml'하세요? –

+0

당신이 실제로 원하는 것입니까? 처음 세 항목 만 원한다면'select = "node() [position() <4]"'를 사용하지 않을까요? – apmasell