2012-03-12 2 views
2

에서 XSLT와 목록을 만들어 다음과 같은 XML 파일이 있습니다두 개의 XML 문서

<root> 
    <sub type="print">print</sub> 
    <sub type="email">email</sub> 
</root> 

내가 각을 일치시킬 다음 목록에 최대 입력 :

<types> 
    <type>email</type> 
    <type>broadcast</type> 
    <type>mobile</type> 
    <type>print</type> 
    <type>web</type> 
</types> 

으로이 XSLT 사용을 " doc "은 xml이고 위의 목록의"types "는 매개 변수로 전달됩니다.

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

    <xsl:output method="xhtml" indent="yes" /> 

    <xsl:param name="doc"/> 
    <xsl:param name="types"/> 

    <xsl:template match="/"> 
    <xsl:for-each select="$doc//sub"> 
     <xsl:variable name="count"> 
     <xsl:number value="position()" format="1"/> 
     </xsl:variable> 

     <ul> 
     <xsl:for-each select="$types//type"> 
      <xsl:choose> 
      <xsl:when test="$doc//sub[$count]/@type = text()"> 
       <li> 
       <b> 
        <xsl:value-of select="$doc//sub[$count]/@type"/> - <xsl:value-of select="text()"/> 
       </b> 
       </li> 
      </xsl:when> 
      <xsl:otherwise> 
       <li> 
       <xsl:value-of select="$doc//sub[$count]/@type"/> - <xsl:value-of select="text()"/> 
       </li> 
      </xsl:otherwise> 
      </xsl:choose> 
     </xsl:for-each> 
     </ul> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

이렇게하면 순서가 지정되지 않은 목록 f 또는 내 xml의 각 하위 인쇄 유형에서 하위 및 다음 각 유형. 하위와 유형이 일치하면 굵게 표시되어야합니다. 나는이 원하는 :

<ul> 
    <li>print - email</li> 
    <li>print - broadcast</li> 
    <li>print - mobile</li> 
    <li><b>print - print</b></li> 
    <li>print - web</li> 
</ul> 
<ul> 
    <li><b>email - email</b></li> 
    <li>email - broadcast</li> 
    <li>email - mobile</li> 
    <li>email - print</li> 
    <li>email - web</li> 
</ul> 

을하지만이 얻을 : 도움 어떠한 모든

<ul> 
    <li><b>print email - email</b></li> 
    <li>print email - broadcast</li> 
    <li>print email - mobile</li> 
    <li><b>print email - print</b></li> 
    <li>print email - web</li> 
</ul> 
<ul> 
    <li><b>print email - email</b></li> 
    <li>print email - broadcast</li> 
    <li>print email - mobile</li> 
    <li><b>print email - print</b></li> 
    <li>print email - web</li> 
</ul> 

감사합니다.

답변

1

//의 여러 용도와 관련이 있다고 생각합니다.

이 당신의 루트 템플릿 ( match="/")를 교체하십시오 :

<xsl:template match="/"> 
    <html> 
     <xsl:for-each select="$doc/root/sub"> 
     <xsl:variable name="vType" select="@type"/> 
     <ul> 
      <xsl:for-each select="$types/types/type"> 
      <li> 
       <xsl:choose> 
       <xsl:when test=".=$vType"> 
        <b> 
        <xsl:value-of select="concat($vType,' - ',.)"/> 
        </b> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="concat($vType,' - ',.)"/> 
       </xsl:otherwise> 
       </xsl:choose>    
      </li> 
      </xsl:for-each> 
     </ul> 
     </xsl:for-each>  
    </html> 
    </xsl:template> 

참고 : 나는 테스트 할 때 잘 형성 제 출력을 유지하기 위해 <html> 태그를 추가했습니다.

+0

감사합니다! 유형을 "sub"에서 변수로 설정 한 다음 유형을 "types"에서 "."으로 구분합니다. 승자였습니다. 매력처럼 일했습니다! – SpockJenkins

+0

@ user972029 - 대단히 환영합니다! +1 좋은 질문입니다. –

0

subtypes.xml

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


<xsl:template match="sub"> 
<ul> 
    <xsl:apply-templates select="doc('subtypes.xml')"> 
    <xsl:with-param name="this" select="." tunnel="yes"/> 
    </xsl:apply-templates> 
</ul> 
</xsl:template> 

<xsl:template match="type"> 
<xsl:param name="this" tunnel="yes"/> 
<li> 
    <xsl:choose> 
    <xsl:when test="$this/@type=."> 
    <b><xsl:value-of select="$this/@type,' - ',."/></b> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="$this/@type,' - ',."/> 
    </xsl:otherwise> 
    </xsl:choose> 
</li> 
</xsl:template> 

</xsl:stylesheet> 

메인 입력 및 종류와 같은 서브 파일을 감안할 때 생산 :

<?xml version="1.0" encoding="UTF-8"?> 
    <ul> 
    <li>print - email</li> 
    <li>print - broadcast</li> 
    <li>print - mobile</li> 
    <li><b>print - print</b></li> 
    <li>print - web</li> 
</ul> 
    <ul> 
    <li><b>email - email</b></li> 
    <li>email - broadcast</li> 
    <li>email - mobile</li> 
    <li>email - print</li> 
    <li>email - web</li> 
</ul>