2014-11-26 2 views
0

XSLT가 처음입니다.XSLT의 속성 값을 기반으로 요소를 그룹화하는 방법은 무엇입니까?

다음은 XML입니다.

<Resource resource_id="603"> 
    <Computer full_name="AJAY-2064" remarks="computer key expired."/> 
</Resource> 
<Resource resource_id="604"> 
    <Computer full_name="AJAY-2070" remarks="computer key expired."/> 
</Resource> 
<Resource resource_id="602"> 
    <Computer full_name="AJAY-1662" remarks="Not a valid key. "/> 
</Resource> 

내 요구 사항은 고유 한 발언 수를 얻고 발언을 기반으로 이름을 그룹화하는 것입니다.

(예)

컴퓨터 키 만료 카운트 (2)

아제-2064
아제-2070

하지 유효한 키 (1)

아제-1662

여기에 xsl이 있습니다.

<xsl:variable name="license.computer" select="Resource/ManagedComputer"/> 

<xsl:key name="keyComputer" match="$license.computer" use="@remarks"/> 

<xsl:for-each select="$license.computer[generate-id() = 
        generate-id(key('keyComputer', @remarks)[1])]"> 
      <xsl:variable name="license.remarks" select="@remarks"/> 

      <xsl:for-each select="$license.computer[contains(@remarks,$license.remarks)]"> 
             <xsl:choose> 
              <xsl:when test="position() mod 2 = 0" > 
              <tr> 
                <td bgcolor="#F9F9F9"><xsl:value-of select="@full_name"/></td> 
                <td bgcolor="#F9F9F9"><xsl:value-of select="@remarks"/></td> 
              </tr> 
              </xsl:when> 
              <xsl:otherwise> 
               <tr> 
                <td bgcolor="#FFFFFF"><xsl:value-of select="@full_name"/></td> 
                <td bgcolor="#FFFFFF"><xsl:value-of select="@remarks"/></td> 
               </tr> 
              </xsl:otherwise> 
             </xsl:choose> 

      </xsl:for-each> 
</xsl:for-each> 

하지만 작동하지 않는 것 같습니다. 필요한 경우 해결 방법을 제공하십시오. 디버거에서 xslt를 디버깅 하시겠습니까?

+0

"XSLT에서 그룹화"를 검색하면 많은 조회수가 발생합니다.이 방법은 사용자가 XSLT 1.0 또는 2.0을 사용하고 있는지 여부에 따라 달라집니다. 위 코드는 XSLT 1.0 기술은 "Muenchian grouping"이라고 불리우는 데, 신인을 위해 상당히 마음이 산란합니다.(당신이 이해하지 못하는 예제 코드를 복사하고 수정 한 적이 있다고 생각합니다. 결코 좋은 전략이 아닙니다.) XSLT 2.0에서는 작업을 수행하는 목적으로 설계된 명령 인 xsl : for-each-group이 있기 때문에 훨씬 간단합니다. –

+0

예. 알아. 우리는 XSLT 2.0을 사용하지 않습니다. 따라서, XSLT 1.0 그룹화에 대한 검색. 그리고 그 절차를 생각해 냈습니다. –

+0

네, 그렇게 생각했습니다. 문제는 대부분의 경우 Google에서 작동하는 방식에 대한 설명없이 예제 코드를 찾을 수 있다는 것입니다. 그리고 그것이 어떻게 작동하는지 이해하지 못한다면, 당신은 그것을 바꾸는 난장판을 만들 것입니다. 그것이 작동하는 방법을 찾는 가장 좋은 방법은 책을 사서 예제와 설명을 통해 작업하는 것입니다. 또는 좋은 자습서 사이트를 찾으십시오. –

답변

1

"작동하지 않는"이유는 상당히 많습니다. 그 중 일부는 실제 코드를 완전히 나타내지 못하기 때문에 발생할 수 있습니다.

여전히 첫 번째 문제는 license.computer 변수입니다. 이 변수가 root과 일치하는 템플릿이 아닌 전역 변수라고 가정하면 xpath 표현식은 문서 노드에 상대적이므로 Resource의 루트 요소를 찾고 있습니다. 하지만 .... 아마 다음과 같이 할 필요가 있도록, 다른 루트 요소가 추측하고

<xsl:variable name="license.computer" select="//Resource/Computer"/> 

(또한주의하여 XSLT가 ManagedComputer을 의미하지만 XML 샘플은 Computer 표시)

다음은, 그것은 당신의 XSLT에서 문제가 사실은 아니지만, 당신은 키의 일치 조건에서 변수를 사용할 수 없습니다, 그래서 당신의 키가 실제로 주목할 가치 또한이

<xsl:key name="keyComputer" match="//Resource/Computer" use="@remarks"/> 

같이해야한다는 것입니다, 그러나 elem을 반복하기 위해 엔트 그룹에, 당신은 당신이 원하는하지 않는 한, 전체 XPath 식을 필요로하지 않는 한 당신은 또한 그냥처럼 정의 할 수 있습니다, 사실이 XSLT 을보십시오이

<xsl:for-each select="key('keyComputer', @remarks)"> 

과 내면의 xsl:for-each을 대체 할 수 이

<xsl:key name="keyComputer" match="Computer" use="@remarks"/> 

도 내가 다시 jigged 한이 XSLT에게

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

    <xsl:variable name="license.computer" select="//Resource/Computer"/> 
    <xsl:key name="keyComputer" match="Computer" use="@remarks"/> 

    <xsl:template match="/"> 
     <xsl:for-each select="$license.computer[generate-id() = generate-id(key('keyComputer', @remarks)[1])]">  
      <xsl:for-each select="key('keyComputer', @remarks)"> 
       <xsl:variable name="bgcolor"> 
       <xsl:choose> 
        <xsl:when test="position() mod 2 = 0" >#F9F9F9</xsl:when> 
        <xsl:otherwise>#FFFFFF</xsl:otherwise> 
       </xsl:choose> 
       </xsl:variable> 
       <tr> 
        <td bgcolor="{$bgcolor}"><xsl:value-of select="@full_name"/></td> 
        <td bgcolor="{$bgcolor}"><xsl:value-of select="@remarks"/></td> 
      </tr> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

참고하십시오 일치하는 Computer 요소를 제한하는 방법을 일부 코드 반복을 피하기 위해 셀의 배경색을 수행합니다.

+0

그게 효과가 있어요. 엄청 고마워. –

관련 문제