2012-11-14 54 views
0

我有這樣一個打印改變根據節點編號

<contents> 
     <content loid="1.0.71719207" type="images"/> 
     <content loid="1.0.71719207" type="images"/> 
    <content loid="1.0.71719207" type="images"/> 
    <content loid="1.0.71719207" type="images"/> 
</contents> 

隨着XSL我想獲得以下XML一個XML文件中的字符串:

<div class="Image_1"></div> 
<div class="Image_2"></div> 
<div class="Image_3"></div> 
<div class="Image_4"></div> 

所以基本上我需要執行一個循環和每<xsl:for-each select="contents/content">打印出<div class="Image_N"></div>其中N是節點的編號。

我想與Altova模擬器,但我不知道如何增加N從1到節點數。

這是我的代碼。我是一個初學者使用XSL:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="no"  encoding="utf-8" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"  doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" /> 
    <xsl:template match="/"> 

         <xsl:for-each select="contents/content"> 
           <div class="EM_Story_Image_N"></div> 

         </xsl:for-each> 


    </xsl:template> 
</xsl:stylesheet> 

回答

1

我推薦學習邁克爾凱的書「XSLT 2.0和XPath 2.0程序員參考」(amazon link with kickback

這裏比使用position()更麻煩:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="no"  encoding="utf-8" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"  doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" /> 
    <xsl:template match="/"> 
     <html> 
      <head><title>Test conteggio</title> 
      </head> 
      <body> 

       <xsl:for-each select="contents/content"> 
        <xsl:variable name="count"><xsl:number level="any" count="content"/></xsl:variable> 
        <div class="Image_{$count}"></div> 
       </xsl:for-each> 

      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 
2

當這個XSLT:

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

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

    <xsl:template match="content"> 
    <div class="Image_{position()}" /> 
    </xsl:template> 

</xsl:stylesheet> 

......被應用到OP的原始XML:

<contents> 
    <content loid="1.0.71719207" type="images"/> 
    <content loid="1.0.71719207" type="images"/> 
    <content loid="1.0.71719207" type="images"/> 
    <content loid="1.0.71719207" type="images"/> 
</contents> 

。 ..產生期望的結果:

<div class="Image_1" /> 
<div class="Image_2" /> 
<div class="Image_3" /> 
<div class="Image_4" /> 
2

有沒有在XSLT沒有計數for循環就像你在多個程序或面向對象的語言得到,但你有機會獲得當前節點的在其上您是通過position()功能遍歷當前列表中的位置。

<xsl:for-each select="contents/content"> 
    <div class="EM_Story_Image_{position()}"></div> 
</xsl:for-each> 

但需要注意的是position()關鍵取決於上下文 - 如果你有,說

<contents> 
    <content loid="1.0.71719207" type="images"/> 
    <content loid="1.0.71719207" type="images"/> 
    <content type="somethingelse" /> 
    <content loid="1.0.71719207" type="images"/> 
    <content loid="1.0.71719207" type="images"/> 
</contents> 

然後在<xsl:for-each select="contents/content">最後<content>元素將是第5位,但在<xsl:for-each select="contents/content[@type='images']">同一節點會是位置4.