2013-06-27 2 views
1

내 데이터를 수정하는 데 너무 오래 걸리므로 xsl을 최적화하려고합니다. 나는 제품에 장소에 이러한 groupIds을 얻고 싶은요소 내용이있는 XSTL 필터

<catalog> 
    <product> 
     <prodid>12345</prodid> 
     ..... 
    </proudct> 
    <product_group_map> 
     <prodid>12345</prodid> 
     <groupid>2435</groupid> 
    </product_group_map> 
</catalog> 

: 같은

내 sourcedata는 (I 수정할 수없는) 보인다. 내가 지금까지했던 것은 다음과 같습니다

<xsl:variable name="id"><xsl:value-of select="prodid"/></xsl:variable> 

<xsl:variable name="grId"> 
    <xsl:for-each select="../product_group_map"> 
     <xsl:if test="prodid = $id"> 
      <xsl:value-of select="groupid"/> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:variable> 

<!-- the actual print of the values --> 
<xsl:value-of select="concat($id, $separator, $grId)"/> 

그래서 프로세스가 O^2를 실행합니다. 7 백만 가지 제품에 대해서는 그렇지 않습니다. 원하는 그룹 ID를 어떻게 든 매칭시킬 수있는 방법이 있습니까? 내가 같은 생각 다음 XML이

<catalog> 
    <product> 
     <prodid>12345</prodid> 
     ..... 
    </proudct> 
    <product_group_map prodId="12345"> 
     <groupid>2435</groupid> 
    </product_group_map> 
</catalog> 

같이한다면 내가 선택과 같이 사용할 수있다 : 첫째

<!--allready in product with the path --> 
<xsl:variable name="id"><xsl:value-of select="prodid"/></xsl:variable> 
<xsl:variable name="groupid"><xsl:value-of select="../product_group_map[@prodid = $prodId]/groupid"/></xsl:variable> 

답변

2

, 당신은 xsl:variable 그냥 value-of을 포함해야하는 비효율적 선택 식을 xsl:variable 자체에 넣는 것이 좋습니다. prodid가 요소

<xsl:variable name="groupid" select="../product_group_map[prodid = $id]/groupid" /> 

이다 그러나이 (모든 템플릿 외부)

<xsl:key name="groupByProduct" match="prod_group_map/groupid" use="../prodid" /> 
을 정의하는 것이 더 효율적일 수 있습니다 경우 둘째, 당신은 당신이 당신의 현재 설정과 속성에 대한 제안 같은 일을 할 수

다음 당신은 단순히

<xsl:variable name="groupid" select="key('groupByProduct', $id)" /> 

주를 사용하여 그룹 ID를 찾을 수 같은을 경우이 서로 다른 그룹 id에 서로 다른 product_group_map 요소로 연결되어 있으면 $groupid 변수는 일치하는 모든 groupid 요소를 포함하는 노드 집합이됩니다.