2011-11-14 37 views
0

以下是代碼的XML片 -如何使用XSLT..PART-2將此XML轉換爲HTML?

<groups> 
    <group i=1> 
    <member t="P.M" c="Y">ABC</member> 
    <member t="P.L">PQR</member> 
    <member t="M">XYZ</member> 
    </group> 
    <group i=2> 
    <member t="M" c="Y">ABC</member> 
    <member t="M">PQR</member> 
    </group> 
    <group i=3> 
    <member t="P.L" c="Y">ABC</member> 
    <member t="M">PQR</member> 
    <member t="M">XYZ</member> 
    </group> 
    <group i=4> 
    <member t="M">ABC</member> 
    <member t="M" c="Y">PQR</member>  
    </group> 
    <group i=5> 
    <member t="M">ABC</member> 
    <member t="M" c="Y">PQR</member>  
    <member t="M" c="Y">XYZ</member>  
    </group> 
    <group i=6> 
    <member t="M" dec="Y">ABC</member> 
    </group> 

</groups> 

希望的HTML輸出使用XSLT 1.0 -

<U>ABC</U>, P.M, PQR, P.L and XYZ, M 
<U>ABC</U> and PQR, MM 
<U>ABC</U>, P.L, PQR and XYZ, MM 
ABC and <U>PQR</U>, MM 
ABC, <U>PQR</U> and <U>XYZ</U>, MM 
<U>ABC</U>, M 

用於上述輸出的局部 XSLT溶液是 -

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 
<xsl:output method='html' media-type='text/html'/> 
<xsl:template match="/"> 
    <html> 
    <body> 
<xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="group"> 
    <p> 
     <xsl:apply-templates select="@*|node()"/> 
    </p> 
</xsl:template> 

<xsl:template match="member"> 
    <xsl:choose> 
    <xsl:when test='@c = "Y"'> 
     <u><xsl:value-of select="."/></u>, <xsl:value-of select='@t'/> 
    </xsl:when> 
    <xsl:otherwise> 
     <b><xsl:value-of select="."/></b>, <xsl:value-of select='@t'/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="member[following-sibling::member]"> 
    <xsl:choose> 
    <xsl:when test='@c = "Y"'> 
     <u><xsl:value-of select="."/></u>, <xsl:value-of select='@t'/> 
     <xsl:text> and </xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
     <b><xsl:value-of select="."/></b>, <xsl:value-of select='@t'/> 
     <xsl:text> and </xsl:text> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="member[following-sibling::member[following-sibling::member]]"> 
    <xsl:choose> 
    <xsl:when test='@c = "Y"'> 
     <u><xsl:value-of select="."/></u>, <xsl:value-of select='@t'/> 
     <xsl:text>, </xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
     <b><xsl:value-of select="."/></b>, <xsl:value-of select='@t'/> 
     <xsl:text>, </xsl:text> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 

上述XSLT以正確格式輸出輸出根據需要,但如果​​ 是相同的類型,那麼如何添加這種類型的最後..?

回答

1

在回答你的眼前問題雖然,輸出的t時的正確數量元素的成員,你可以做這樣的事情:

<xsl:apply-templates select="../member/@t[. = current()/@t]"/> 

因此,它會爲每個匹配輸出的值@t屬性。

但是,我認爲您需要閱讀更多有關分組的內容,正如Michael Kay先生在您最後一個問題中所建議的那樣。

在這種情況下,您正在按屬性和成員屬性進行分組。所以,你會定義一個關鍵,像這樣

<xsl:key name="members" match="member" use="concat(../@i, '|', @t)"/> 

請注意使用管道的|來連接密鑰的兩個部分。你需要選擇一個不能出現在密鑰的任何部分的字符。

然後,你可以得到每個組的第一個元素,像這樣

<xsl:apply-templates 
select="group/member[generate-id() = generate-id(key('members', concat(../@i, '|', @t))[1])]" 
mode="group"/> 

,並通過組中的所有元素,你就可以做到這一點迭代...

<xsl:apply-templates select="key('members', concat(../@i, '|', @t))"/> 

因此,鑑於以下XML

<groups> 
    <group i="1"> 
     <member t="P.M" c="Y">ABC</member> 
     <member t="P.L">PQR</member> 
     <member t="M">XYZ</member> 
    </group> 
    <group i="2"> 
     <member t="M" c="Y">ABC</member> 
     <member t="M">PQR</member> 
    </group> 
    <group i="3"> 
     <member t="P.L" c="Y">ABC</member> 
     <member t="M">PQR</member> 
     <member t="M">XYZ</member> 
    </group> 
    <group i="4"> 
     <member t="M">ABC</member> 
     <member t="M" c="Y">PQR</member> 
    </group> 
    <group i="5"> 
     <member t="M">ABC</member> 
     <member t="M" c="Y">PQR</member> 
     <member t="M" c="Y">XYZ</member> 
    </group> 
    <group i="6"> 
     <member t="M" c="Y">ABC</member> 
    </group> 
</groups> 

使用下面的XSLT ....

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

    <xsl:key name="members" match="member" use="concat(../@i, '|', @t)"/> 

    <xsl:template match="/groups"> 
     <xsl:apply-templates select="group/member[generate-id() = generate-id(key('members', concat(../@i, '|', @t))[1])]" mode="group"/> 
    </xsl:template> 

    <xsl:template match="member" mode="group"> 
     <xsl:apply-templates select="key('members', concat(../@i, '|', @t))"/> 
     <xsl:text>, </xsl:text> 
     <xsl:apply-templates select="../member/@t[. = current()/@t]"/> 
     <xsl:variable name="others" select="count(following-sibling::member[@t != current()/@t])" /> 
     <xsl:choose> 
     <xsl:when test="$others &gt; 1">, </xsl:when> 
     <xsl:when test="$others = 1"> and </xsl:when> 
     <xsl:otherwise> 
      <xsl:text>&#13;</xsl:text> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template match="member"> 
     <xsl:choose> 
     <xsl:when test="@c='Y'"> 
      <u> 
       <xsl:value-of select="."/> 
      </u> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="."/> 
     </xsl:otherwise> 
     </xsl:choose> 
     <xsl:variable name="others" select="count(following-sibling::member[@t = current()/@t])" /> 
     <xsl:choose> 
     <xsl:when test="$others &gt; 1">, </xsl:when> 
     <xsl:when test="$others = 1"> and </xsl:when> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

以下是輸出....

<u>ABC</u>, P.M, PQR, P.L and XYZ, M 
<u>ABC</u> and PQR, MM 
<u>ABC</u>, P.L, PQR and XYZ, MM 
ABC and <u>PQR</u>, MM 
ABC, <u>PQR</u> and <u>XYZ</u>, MMM 
<u>ABC</u>, M 
+0

非常感謝......順便說一句,我使用你已經給我的XSLT。我的意思是,這是一個回答另一個問題我的。再次感謝.. :) – John