2014-02-28 4 views
1

제목이 혼동을 줄 수 있습니다. 누구나 이에 대한 정확한 용어가 있다면 편집하십시오. 나는이 유사한 출력을 얻으려면XSLT의 상위 노드 그룹당

<?xml version="1.0"?> 
    <?xml-stylesheet type="text/xsl" href="show.xsl"?> 
    <patients> 
     <patient> 
      <name>Joe</name> 
      <age>45</age> 
      <kids> 
       <kid> 
        <name>Ramsay</name> 
        <gender>M</gender> 
       </kid> 
       <kid> 
        <name>Eva</name> 
        <gender>F</gender> 
       </kid> 
       <kid> 
        <name>Arthas</name> 
        <gender>M</gender> 
       </kid> 
      </kids> 
     </patient> 
     <patient> 
      <name>Adam</name> 
      <age>34</age> 
      <kids> 
       <kid> 
        <name>Jon</name> 
        <gender>M</gender> 
       </kid> 
       <kid> 
        <name>Jane</name> 
        <gender>F</gender> 
       </kid> 
       <kid> 
        <name>Sunita</name> 
        <gender>F</gender> 
       </kid> 
      </kids> 
     </patient> 
    </patients> 

: 나는이 같은 XML 입력 파일이

다음
Name: Joe 
    Age: 45 
    Kids: 
     Boys: 
      Ramsay 
      Arthas 
     Girls: 
      Eva 
    Name: Adam 
    Age: 34 
    Kids: 
     Boys: 
      Jon 
     Girls: 
      Jane 
      Sunita 

내가 XSL 사용하여 쓴 XSLT입니다 : 키 만은 잘못된 출력을 제공 그것은 환자를 현명하게 분류 할 수 없다.

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:key name="header" match="//kid" use="gender"/> 
<xsl:template match="//patients/patient"> 
     <xsl:value-of select="name"/> 
     <xsl:text xml:space="preserve"> 
     </xsl:text> 
     <xsl:value-of select="age"/> 
     <xsl:text xml:space="preserve"> 
     </xsl:text> 
     <xsl:text xml:space="preserve">Boys: 
      </xsl:text> 
     <xsl:for-each select="key('header', 'M')"> 
      <xsl:value-of select="name"/> 
      <xsl:text xml:space="preserve"> 
      </xsl:text> 
     </xsl:for-each> 
     <xsl:text xml:space="preserve"> 
     </xsl:text>   
<xsl:text xml:space="preserve">Girls: 
      </xsl:text> 
     <xsl:for-each select="key('header', 'F')"> 
      <xsl:value-of select="name"/> 
      <xsl:text xml:space="preserve"> 
      </xsl:text> 
     </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

나는 XSLT 1.0에서 해결책을 찾고있다.

+0

데이터에 환자의 고유 ID가 포함되어 있지 않습니까? –

+0

이름을 고유 한 ID로 볼 수 있습니다. –

답변

0

데이터에 고유 한 환자 ID가없는 경우 (또는 환자 ID가있는 경우에도) generate-id() 함수를 사용하여 데이터를 생성 할 수 있습니다.

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

<xsl:output method="text" encoding="UTF-8" /> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kids-by-gender" match="kid" use="concat(generate-id(ancestor::patient), gender)"/> 

<xsl:template match="patient"> 
    <xsl:variable name="pid" select="generate-id()" /> 
    <xsl:value-of select="concat('Name: ', name, '&#10;') "/> 
    <xsl:value-of select="concat('Age: ', age, '&#10;') "/> 
    <xsl:text>Kids:&#10;</xsl:text> 
    <xsl:text>&#9;Boys:&#10;</xsl:text> 
    <xsl:apply-templates select="key('kids-by-gender', concat($pid, 'M')) "/> 
    <xsl:text>&#9;Girls:&#10;</xsl:text> 
    <xsl:apply-templates select="key('kids-by-gender', concat($pid, 'F')) "/> 
    <xsl:text>&#10;</xsl:text> 
</xsl:template> 

<xsl:template match="kid"> 
    <xsl:value-of select="concat('&#9;&#9;', name, '&#10;') "/> 
</xsl:template> 
</xsl:stylesheet> 

참고이 어느 섹스없이 아이들과 함께 환자를 수용하기 위해 더 많은 작업을 필요로 : 난 당신이 (일반적으로 이름이 고유 한 것으로 추정 할 수없는) 하나를 가지고, 그래서이 방법을 시도 할 경우 확실하지 않다 , 또는 전혀 아이들이 없습니다.

관련 문제