2014-05-13 5 views
0

실례합니다. 나는 XSL과 XML 변환을 막 시작하고있다.XSL을 사용하여 레코드 목록 변환

공급 업체로부터 xml 데이터를 수신했습니다. 변환시 특정 "ids"만 포함하면됩니다. ID를 기반으로 한 "표시 이름"을 최종 출력에 추가해야합니다. XSL에 필요한 ID 및 표시 이름을 수동으로 추가 할 수 있습니다.

XML 예.

는 는
<root> 
    <DATA> 
    <ID>rd_bl</ID> 
    <travel>15</travel< 
    <delay>7</delay> 
    </DATA> 
    <DATA> 
    <ID>yl_gr</ID> 
    <travel>18</travel< 
    <delay>9</delay> 
    </DATA> 
    <DATA> 
    <ID>pu_gr</ID> 
    <travel>17</travel< 
    <delay>6</delay> 
    </DATA> 
</root> 
는 은 내가 아이디와 XSL에서 "표시 이름"의 목록을 작성하려합니다

- 나열된 ID를 가진 레코드 만 포함됩니다.

ID - 표시 이름

rd_bl - 레드 블루

pu_gr에 - 퍼플 yl_gr의 데이터가 무시되고 변환에 표시되지 것이 예에서

그린에.

도움을 주시면 대단히 감사하겠습니다.

감사합니다.

+0

누군가에게 전체 스타일 시트를 작성하도록 요청합니까? –

+0

전혀 아닙니다 - 나머지 스타일 시트가 필요합니다. 제 XSL 경험은 제한되어 있습니다. 각 노드를 처리하기 위해 XSL : for-each를 사용하는 것에 익숙합니다. 몇 가지 값을 선택하고 표시 이름을 추가하는 방법이 손실되었습니다. 몇 가지 변수와 루프를 적용하려고했지만 올바른 방향으로 지적해야합니다. – ClintHend

+0

XSL 2.0을 사용할 수 있습니까? –

답변

0

다음은 ID가 승인 된 ID 목록 내에 있는지 확인하고 출력에서 ​​"표시 이름"을 사용하는 간단한 스타일 시트입니다.

<root> 
    <entry> 
    <name>Red to Blue</name> 
    <travel>15</travel> 
    <delay>7</delay> 
    </entry> 
    <entry> 
    <name>Purple to Green</name> 
    <travel>17</travel> 
    <delay>6</delay> 
    </entry> 
</root> 

편집 : 당신이 XSL 1.0와 함께 붙어있는 경우 :

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

    <xsl:variable name="desired-ids">rd_bl="Red to Blue" pu_gr="Purple to Green"</xsl:variable> 

    <xsl:template match="root"> 
    <root> 
     <xsl:apply-templates /> 
    </root> 
    </xsl:template> 

    <xsl:template match="DATA"> 
    <xsl:variable name="current-id" select="ID/text()" /> 
    <xsl:variable name="id-with-equals" select="concat($current-id, '=')" /> 
    <xsl:if test="contains($desired-ids, $id-with-equals)"> 
     <xsl:variable name="id-with-open-quote" select="concat($id-with-equals, '&quot;')" /> 
     <xsl:variable name="display-name" select="substring-before(substring-after($desired-ids, $id-with-open-quote), '&quot;')" /> 
     <entry> 
     <name> 
      <xsl:value-of select="$display-name" /> 
     </name> 
     <travel> 
      <xsl:value-of select="travel" /> 
     </travel> 
     <delay> 
      <xsl:value-of select="delay" /> 
     </delay> 
     </entry> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

당신이 볼 수 닫는 태그 오류를 수정 한 후 예를 들어, XML을 사용하여

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:variable name="desired-ids"> 
    <id name="rd_bl">Red to Blue</id> 
    <id name="pu_gr">Purple to Green</id> 
    </xsl:variable> 

    <xsl:template match="root"> 
    <root> 
     <xsl:apply-templates /> 
    </root> 
    </xsl:template> 

    <xsl:template match="DATA"> 
    <xsl:variable name="current-id" select="ID/text()" /> 
    <xsl:if test="$desired-ids/id[@name=$current-id]"> 
     <entry> 
     <name> 
      <xsl:value-of select="$desired-ids/id[@name=$current-id]" /> 
     </name> 
     <travel> 
      <xsl:value-of select="travel" /> 
     </travel> 
     <delay> 
      <xsl:value-of select="delay" /> 
     </delay> 
     </entry> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

출력 이것은 훨씬 덜 우아하고, 어색한 문자열 일치를 사용하여 유효한 ID를 확인하고 표시 이름을 추출합니다.

+0

벅 - 이거 멋지 네요! 시트를 가져 주셔서 감사합니다. 나는 XSL 1.0을 포함시켜야한다. 저를 믿으십시오 - 나는 당신의 XSL 2.0 버전을 또한 절약하고있다! 나는 당신이 끈 등으로하고있는 것을 따라갈 수있다. 그러나 나는 나 혼자서 거기에 도착했을 것 같은데. 다시 큰 감사합니다! (내 XML 예제로 끝 태그에 내 실수 한 타이핑을 용서하십시오) – ClintHend

+0

당신을 환영합니다, 다행히도 당신을 위해 일할 것입니다! XSL/XPath는 익숙해 져야합니다. –

0

이 스타일 시트는 도움이됩니까?

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="/"> 
     <table> 
      <thead> 
       <th>ID</th> 
       <th>Display Name</th> 
      </thead> 
      <tbody> 
       <xsl:apply-templates select="root/DATA"/> 
      </tbody> 
     </table> 
    </xsl:template> 

    <xsl:template match="DATA"> 
     <xsl:choose> 
      <xsl:when test="ID='rd_bl'"> 
       <tr> 
        <td><xsl:value-of select="ID"/></td> 
        <td>Red to Blue</td> 
       </tr> 
      </xsl:when> 
      <xsl:when test="ID='pu_gr'"> 
       <tr> 
        <td><xsl:value-of select="ID"/></td> 
        <td>Purple to Green</td> 
       </tr> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 
+0

정보 주셔서 감사합니다. 나는 선택할 때, 20 ~ 30 개의 id가 포함될 필요가 있기 때문에 선택을 피하기를 희망한다. 또한 내 질문에 분명 아니었다 -하지만 거기에 각각의 "레코드"에 대한 xsl 처리에 대한 자세한 내용은 각각의 성명에 포함하지 않아도되고 싶습니다. 답장을 보내 주셔서 감사합니다! – ClintHend