2011-04-16 77 views
4

如何根據xml節點順序進行轉換?按預定義順序進行XSLT節點轉換

的XML文件是這樣的

<root> 
    <paragraph>First paragraph</paragraph> 
    <paragraph>Second paragraph</paragraph> 
    <unordered_list> 
     <list_name>Unordered list name</list_name> 
     <list_element>First element</list_element> 
     <list_element>Second element</list_element>  
    </unordered_list> 
    <paragraph>Third paragraph</paragraph> 
</root> 

我想變換成HTML

... 
<p>First paragraph</p> 
<p>Second Paragraph</p> 
<h3>Unordered list name</h3> 
<ul> 
    <li>First element</li> 
    <li>Second element</li> 
</ul> 
<p>Third paragraph</p> 
... 

當我使用的xsl:for-每個 它輸出的所有段落第一和然後是列表,或者其他方式。 我想保留XML文件的順序。 我知道這可能是非常基本的,但我似乎越來越無法使用xsl:選擇xsl:如果。所以請幫助我一個人。

+1

請粘貼您現在擁有的XSLT ,以便我們改進它。 – 2011-04-16 08:38:50

+0

好問題,+1。請參閱我的答案以獲得更緊湊和更簡潔的解決方案。 – 2011-04-16 17:21:15

回答

1

下面是一個簡單的XSLT樣式表,它正是你正在尋找它:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!-- iterate through all the child nodes, 
    and apply the proper template to them --> 
    <xsl:template match="/"> 
     <!-- added an extra div tag, to create a correct xml 
     that contains only one root tag --> 
     <div> 
      <xsl:apply-templates /> 
     </div> 
    </xsl:template> 

    <!-- create the **p** tags --> 
    <xsl:template match="paragraph"> 
     <p> 
      <xsl:value-of select="text()" /> 
     </p> 
    </xsl:template> 

    <!-- create the **ul** tags --> 
    <xsl:template match="unordered_list"> 
     <h3> 
      <xsl:value-of select="list_name" /> 
     </h3> 
     <ul> 
      <xsl:apply-templates select="list_element" /> 
     </ul> 
    </xsl:template> 

    <!-- create the **li** tags --> 
    <xsl:template match="list_element"> 
     <li> 
      <xsl:value-of select="text()" /> 
     </li> 
    </xsl:template> 
</xsl:stylesheet> 

這種轉變的結果應該是:

<?xml version="1.0" encoding="UTF-8"?> 
<div> 
    <p>First paragraph</p> 
    <p>Second paragraph</p> 
    <h3>Unordered list name</h3> 
    <ul> 
     <li>First element</li> 
     <li>Second element</li> 
    </ul> 
    <p>Third paragraph</p> 
</div> 
+1

+1更多推式。最好使用'xsl:apply-templates'而不是'xsl:value-of' ... – 2011-04-17 23:04:41

1

更短和更consize改造

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="unordered_list/list_name"> 
    <h3><xsl:apply-templates/></h3> 
</xsl:template> 

<xsl:template match="unordered_list/list_element"/> 

<xsl:template match="unordered_list/list_element[1]"> 
    <ul> 
    <xsl:apply-templates mode="list" 
     select=".|following-sibling::*"/> 
    </ul> 
</xsl:template> 

<xsl:template mode="list" match="unordered_list/list_element"> 
    <li><xsl:apply-templates/></li> 
</xsl:template> 
</xsl:stylesheet> 
+0

+1更多拉式。 – 2011-04-17 23:05:11