2011-03-27 5 views
0

내가for-each가 일관되게 작동하지 않는 이유는 무엇입니까?

<xsl:for-each select="plm:PLMXML/plm:ProductRevision> 

를 사용하여 가치의 같은

<td><xsl:value-of select="plm:UserData/plm:UserValue[1]/@value"/></td> 

에서 내가 XSL로 형성하고있는 웹 페이지를 다음과 완벽하게 작동합니다. 내가

<xsl:for-each select="plm:PLMXML> 

을 사용하지만 가치의

<td> 
    <xsl:value-of 
     select="plm:ProductRevision/plm:UserData/plm:UserValue[1]/@value"/> 
</td> 

에서와는 내가 만드는 오전 웹 페이지가 더 이상 제대로 형성되지 않는다.

는 첫 번째 경우에서, HTM 출력이 같다 :

<body> 
     <h2>My CD Collection</h2> 
     <table border="1"> 
     <tr bgcolor="#9acd33"> 
      <th>Category Type</th> 
      <th>DS Def. Modified?</th> 
      <th>DS Def Verified?</th> 
      <th>Designation</th> 
      <th>Hazardous</th> 
      <th>test column</th> 
      <th>Make/Buy</th> 
      <th>Packaging</th> 
     </tr> 
     <tr> 
      <td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td>Make</td> 
       <td></td> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td>Make</td> 
       <td></td> 
      </td> 
     </tr> 
     </table> 
    </body> 
</html> 

이이되어야하는 것처럼된다. htm 테이블에는 두 개의 행이 있습니다. 두 번째 시나리오에서 출력되는 내용은 for-each 선택 값에서 plm:ProductRevision을 가져와 value-of select 문 시작 부분에 추가 한 것입니다. 두 가지는 동의어가 아니어야합니까? 이것이 끝났을 때의 결과입니다.

<html xmlns:plm="http://www.plmxml.org/Schemas/PLMXMLSchema" xmlns:plmxml_cl="http://www.plmxml.org/Schemas/PLMXMLClassificationSchema"> 
    <body> 
     <h2>My CD Collection</h2> 
     <table border="1"> 
     <tr bgcolor="#9acd33"> 
      <th>Category Type</th> 
      <th>DS Def. Modified?</th> 
      <th>DS Def Verified?</th> 
      <th>Designation</th> 
      <th>Hazardous</th> 
      <th>test column</th> 
      <th>Make/Buy</th> 
      <th>Packaging</th> 
     </tr> 
     <tr> 
      <td> 
       <td> </td> 
       <td> </td> 
       <td> </td> 
       <td> </td> 
       <td> </td> 
       <td>Make Make</td> 
       <td> </td> 
      </td> 
     </tr> 
     </table> 
    </body> 
</html> 

이유를 이해해주십시오. 두 번째 방법을 수행해야하는 이유는 plm : PLMXML의 상위 노드와 다른 노드의 값을 갖고 있기 때문입니다. PLMXML/PLM : ProductRevision 및 PLM 미만 : 말하면 I는 PLM 아래의 값을 가질 PLMXML/plmxml_cl : ICO는 그래서 그것을 출력 원하는 코드를하지 않는 위와 같이 그러나

<xsl:for-each select="plm:PLMXML> 
<tr> 
<td> 
    <xsl:value-of 
     select="plm:ProductRevision/plm:UserData/plm:UserValue[2]/@value"/> 
</td> 
<td> 
    <xsl:value-of 
     select="plmxml_cl:ICO/plmxml_cl:Property[@attributeId='3000011']/plmxml_cl:Value"/> 
</td> 
</tr> 
</for-each> 

사용할. 이 점을 이해하는 데 도움이 될 수있는 모든 사항은 크게 감사하겠습니다. 추가 정보가 필요하면 알려주십시오. 즉시 제공 할 것입니다. 고맙습니다!

+0

@ user678526 - 답변을주었습니다. 그러나 예제 입력 (예 : 실제 소스 문서)을 제공하는 것이 옳은지 쉽게 판단 할 수 있습니다. –

+0

좋은 질문입니다, +1. 추가 설명에 대한 내 대답을 Ssee. –

답변

1

두 번째 (또는 세 번째)가 있다고 추측하는 각 plm:PLMXML/plm:ProductRevision에 첫 번째 표현이 반복됩니다. 두 번째 표현식은 각각 plm:PLMXML을 반복합니다. 그 중에서 하나만 (또는 2 개) 있다고 추측합니다.

이들은 동일한 표현식이 아닙니다. 그들은 다른 구조를 반복합니다. for-each의 본문은 select과 일치하는 집합의 각 노드에 대해 한 번 실행됩니다. select 표현이 다르므로 일치하는 항목의 수는 for-each 본문에 포함 된 것과 관계없이 달라질 수 있습니다. @lwburk하여 정답 외에

+0

+1 분명히 맞습니다. –

1

,이 동작은 <xsl:value-of select="someExpression">someExpression 의해 선택된 상기 첫 번째 노드의 스트링 값을 출력 사실에 기인한다.

내 생각 엔 두 번째 경우에 바꿀 경우이다 :

<xsl:value-of   
    select="plm:ProductRevision/plm:UserData/plm:UserValue[1]/@value"/> 

<xsl:for-each select= 
     "plm:ProductRevision/plm:UserData/plm:UserValue[1]/@value"> 
     <xsl:value-of select="."/> 
    </xsl:for-each> 

으로는, 결과는 최초의 변환과 정확히 동일합니다 .

0

두 번째 사건의 시작 :

PLM : ProductRevision/PLM : 모든 PLM에서 UserData를 요소 : ProductRevision 요소

UserData를

모든 PLM을 선택하는 것입니다.

는 (그것은 당신의 출력에서 ​​이러한 요소의 두 가지가있는 것 같습니다.)

표현은 모든 이들 UserData를 요소의 첫 번째 UserValue을 찾아 간다.

마지막으로 모든 UserValue 요소의 @value 속성이 출력됩니다.

이 때문에 "확인"이 하나의 td로 표시됩니다.

관련 문제