2014-02-28 44 views
1

問題的標題可能會令人困惑。如果任何人有這個正確的術語,請編輯。 我有一個這樣的XML輸入文件: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> 

我想類似這樣的輸出:

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(或者即使有),也可以使用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> 

注意,這需要更多的工作,以適應患者沒有孩子不論男女, ,或根本沒有孩子。