2017-01-19 1 views
0

for-each 루프 외부의 요소에 액세스하는 데 문제가 있습니다. 여기 내 XML이있다. 여기 access external 요소 for each each 내부

<JobList sta.time="151.879"> 
<Job T.number="7" T.identifier="Tool" T.holder.comment="Holder" sta.time="30.789" /> 
<Job T.number="5" T.identifier="Second" T.holder.comment="secholder" sta.time="35.567" /> 
<Job T.number="7" T.identifier="Tool" T.holder.comment="Holder" sta.time="4.778" /> 
<Job T.number="5" T.identifier="Second" T.holder.comment="secholder" sta.time="80.745" /> 
<Tool sta.time="116.312" number="5" /> 
<Tool sta.time="35.567" number="7" /> 
</JobList> 

내 XSL의 추출물

<table width="100%" border="1"> 
     <thead> 
     <tr> 
      <td>Numbers</td> 
      <td>Description</td> 
      <td>Holder</td> 
      <td>Time</td> 
     </tr> 
     </thead> 
     <tbody> 
     <xsl:variable name="vsortOrder" select="//Job[@T.number]" /> 
     <xsl:for-each select="//Job[not(@T.number=preceding::Job/@T.number)]"> 
      <tr> 
      <td> 
       <xsl:value-of select="@T.number" /> 
      </td> 
      <td> 
       <xsl:value-of select="@T.identifier" /> 
      </td> 
      <td> 
       <xsl:value-of select="@T.holder.comment" /> 
      </td> 
      </xsl:for-each> 
      <xsl:for-each select="//Tool[$vsortOrder/Job/@T.number]"> 
      <td> 
       <xsl:value-of select="format-number(@sta.time div 60,'#0.00')" /> 
      </td> 
      </tr> 
     </xsl:for-each> 
     </tbody> 
    </table> 

원하는 출력 :

 <div> 
    <h1> 
    <table width="100%" border="1"> 
    <thead> 
     <tr> 
      <td>Numbers</td> 
      <td>Description</td> 
      <td>Holder</td> 
      <td>Time</td> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
      <td>7</td> 
      <td>Tool</td> 
      <td>Holder</td> 
      <td>0.59</td> 
     </tr> 
     <tr> 
      <td>5</td> 
      <td>Second</td> 
      <td>secholder</td> 
      <td>1.93</td> 
     </tr> 
    </tbody> 
    </table> 
    </h1> 
    </div> 

난에서 "//Tool/sta.time"의 값을 표시하는 것을 시도하고있다 @ T.number와 같은 순서. 어떤 생각을 어떻게 할 것인가/이것을 구조화 할 것인가?

+0

아마도'/'의 과용과''xsl : for-each'의 조합,''preceding-sibling ::'대신''preceding ::'를 사용하는 것입니다. 몇 가지 XSLT 변경 사항을 제안 할 수 있도록 원하는 출력을 추가 할 수 있습니까? –

+0

내가 원하는 결과에 추가했습니다. –

+0

결과가 의미가 없습니다. 'T.number = 7'에 연결된'sta.time '값은 35.567이며, 60으로 나눈 값은 0.59입니다. 그러나 T.number = 5 인 행에 0.59을 표시합니다. 그리고 0.84의 값은 어디에서 왔습니까? –

답변

0

--- ---

바람직한 방법은 Toolnumber을 선택하여 현재 JobT.number 정의하는 일치하는 key로서 :

<xsl:key name="tool" match="Tool" use="@number" /> 

다음으로 사용하십시오.

이 그 3,691,363,210
<xsl:value-of select="format-number(key('tool', @T.number)/@sta.time div 60,'0.00')"/> 

참고 :

<xsl:for-each select="//Job[not(@T.number=preceding::Job/@T.number)]"> 

는 중복을 제거하는 좋은 방법이 아니다. 다음 스타일 시트에서와 같이, 대신 Muenchian method를 이용해야한다 : 이것은 당신의 입력 예에 적용되는

XSLT 1.0

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

<xsl:key name="job" match="Job" use="@T.number" /> 
<xsl:key name="tool" match="Tool" use="@number" /> 

<xsl:template match="/JobList"> 
    <table width="100%" border="1"> 
     <thead> 
      <tr> 
       <td>Numbers</td> 
       <td>Description</td> 
       <td>Holder</td> 
       <td>Time</td> 
      </tr> 
     </thead> 
     <tbody> 
      <xsl:for-each select="Job[count(. | key('job', @T.number)[1]) = 1]"> 
       <tr> 
        <td> 
         <xsl:value-of select="@T.number" /> 
        </td> 
        <td> 
         <xsl:value-of select="@T.identifier" /> 
        </td> 
        <td> 
         <xsl:value-of select="@T.holder.comment" /> 
        </td> 
        <td> 
         <xsl:value-of select="format-number(key('tool', @T.number)/@sta.time div 60,'0.00')"/> 
        </td> 
       </tr> 
      </xsl:for-each> 
     </tbody> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

, 그 결과는 다음과 같습니다

<table width="100%" border="1"> 
    <thead> 
     <tr> 
     <td>Numbers</td> 
     <td>Description</td> 
     <td>Holder</td> 
     <td>Time</td> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
     <td>7</td> 
     <td>Tool</td> 
     <td>Holder</td> 
     <td>0.59</td> 
     </tr> 
     <tr> 
     <td>5</td> 
     <td>Second</td> 
     <td>secholder</td> 
     <td>1.94</td> 
     </tr> 
    </tbody> 
</table> 

이것은 질문에 표시된 결과와 다르지만 올바른 결과라고 생각됩니다.

+0

두 번째 XSL 코드를 시험해 보았지만 작동하지만 한 가지 문제가 발생했습니다. 내 질문에 "도구"요소가 T. 번호에 의해 숫자 순서로 언급하는 것을 잊어 버렸습니다. 그래서 코드를 실행할 때 sta.time을 올바른 순서로 인쇄하지 않고 일부 영역에는 NaN이 있습니다. 질문에서 코드를 업데이트했습니다. –

+0

@AlexW'Job'과'Tool '이'T.number'와'number'의 공통 값으로 연결되어 있다고 가정하는 것이 맞습니까? 그리고 그렇다면,이 독특한 것들이 있습니까? 귀하의 예를 업데이트하고 발생할 수있는 중복을 보여주십시오. –

+0

예 "T.number"는 "number"와 같지만 "T.number"는 주문에 정렬되어 있습니다. 표시해야 할 필요가 있습니다. 적절한 "sta.time"값을 사용하여 XML을 업데이트했습니다. 정말로 나를 도와 주셔서 감사합니다. –

0

작업 요소 및 도구 요소의 위치를 ​​활용하여 JobTool에 매핑 할 수 있습니다. 작업의 첫 번째 항목은 원본 XML의 도구 요소의 첫 번째 항목에 해당하기 때문에, 같은 것을 할 :

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 
    <xsl:template match="/"> 
     <table width="100%" border="1"> 
     <thead> 
     <tr> 
      <td>Numbers</td> 
      <td>Description</td> 
      <td>Holder</td> 
      <td>Time</td> 
     </tr> 
     </thead> 
     <tbody> 
     <xsl:variable name="vsortOrder" select="//Tool" /> 
     <xsl:for-each select="//Job[not(@T.number=preceding::Job/@T.number)]"> 
      <tr> 
      <td> 
       <xsl:value-of select="@T.number" /> 
      </td> 
      <td> 
       <xsl:value-of select="@T.identifier" /> 
      </td> 
      <td> 
       <xsl:value-of select="@T.holder.comment" /> 
      </td> 
      <td> 
      <xsl:variable name="job-position" select="position()"/> 
      <xsl:value-of select="format-number($vsortOrder[position()=$job-position]/@sta.time div 60,'0.00')"/> 
      </td> 
      </tr> 
      </xsl:for-each> 
     </tbody> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 

테스트 <xsl:for-each select="//Job[not(@T.number=preceding::Job/@T.number)]"> 양식, (? 또는 그 이상) 같은과 함께 작업 요소는 두 가지가있을 수 있습니다 보인다 T. 번호와 당신은 하나로서 취급하고 싶습니다. 이를 위해 muenchian 그룹을 사용하여 고유 한 T.number로 작업을 저장하고 그 위치를 vsortOrder에있는 Tool 요소의 위치와 일치시키는 것이 좋습니다. 명확화의 관점에서 편집

+1

** 1. ** 먼저'exsl' 접두어를 네임 스페이스에 바인딩하지 않고'exsl : node-set()'을 사용할 수 없습니다. - ** 2. ** 여기서'exsl : node-set()'을 사용할 필요가 없습니다; 변수는 이미 노드 집합입니다. 그리고 변수가 실제로 필요하지도 않습니다. –

+0

Thanks @ michael.hor257k. node-set 확장 기능을 제거했습니다. 내 원래 솔루션의 일부로 변수를 사용하여 고집 오전. – Madeyedexter

+0

나는 "도구"요소가 T. 번호에 의해 숫자 순서대로 있다는 것을 내 질문에 언급하는 것을 깜빡했다. 질문을 새로운 가치로 업데이트했습니다. 귀하의 코드를 밖으로 tryled 때 sta.time 올바른 순서로 wasnt. 내 질문에 그걸 전가하지 않아서 미안해. 나는 그것을 간과했다. –