2014-05-15 19 views
1

這是關於通過使用索引文件訪問單個XML文件的多個分組XML文件的頁碼編號。編號必須爲每個組重新開始,並跨越組中的所有文件。這是我的index.xml文件,定義了團體和個人文件:如何給頁面編組?

<list> 
    <numberGroup> 
    <entry> 
     <file>n1.xml</file> 
    </entry> 
    <entry> 
     <file>n2.xml</file> 
    </entry> 
    <entry> 
     <file>n3.xml</file> 
    </entry> 
    </numberGroup> 
    <numberGroup> 
    <entry> 
     <file>p1.xml</file> 
    </entry> 
    <entry> 
     <file>p2.xml</file> 
    </entry> 
    <entry> 
     <file>p3.xml</file> 
    </entry> 
    </numberGroup> 
    <numberGroup> 
    <entry> 
     <file>a1.xml</file> 
    </entry> 
    <entry> 
     <file>a3.xml</file> 
    </entry> 
    </numberGroup> 
</list> 

所有<file>小號n1.xmln2.xml等有衆多的標籤<page/>,即在轉換過程轉化爲頁碼。 (<span class="r" id="pg12">...</span>

這是模板我到目前爲止:

<xsl:template match="page"> 
<xsl:variable name="vRoot" select="generate-id(/)"/> 
<xsl:variable name="vPage" select="$vFiles[$vRoot = generate-id(document(.))]"/> 
<span class="r"> 
    <xsl:attribute name="id">pg<xsl:value-of select="count(document((.|$vPage)/preceding::file)//page | (.|$vPage)/preceding::page) + 1"> 
    </xsl:value-of></xsl:attribute> 
     ... 
</span> 
</xsl:template> 

的問題是,該編號不爲1重啓每個新numberGroup

有什麼建議嗎?

+0

'的'我看不出有什麼'page'元素在你的XML?一般來說,我建議你看看''元素。 –

+0

位於n1.xml,n2.xml等文件中。 (對不起,我錯誤地使用了< >,以上)這些是分頁的。顯示的是INDEX文件。我認爲問題在於數值論證。 – Erik

+0

請添加更多細節。 1)展示你的'n1.xml','n2.xml','p1.xml'等頁面的例子。 2)顯示更多的樣式表(整個樣式表最好)。3)添加預期結果的樣本。 – helderdarocha

回答

1

您正在考慮考慮所有page元素的完整節點集的元素。如果您想重新啓動每個numberGroup中的編號,您必須在此上下文中選擇它們。

我假設你n1.xmlp1.xml文件有以下格式:

<pages> 
    <page/> 
    <page/> 
    <page/> 
</pages> 

您可以限制選擇的背景下,這是每個numberGroup通過創建numberGroup模板,選擇page文件該範圍內的元素:現在

<xsl:template match="numberGroup"> 
    <xsl:apply-templates select="document(entry/file)//page"/> 
</xsl:template> 

,爲每個頁面,你只需要得到它的position()

<xsl:template match="page"> 
    <span class="r" id="pg{position()}"/> 
</xsl:template> 

這會產生這樣的結果:

<div> 
    <span class="r" id="pg1"/> 
    <span class="r" id="pg2"/> 
    ... 
    <span class="r" id="pg99"/> <!-- total pages of all files in the first group --> 
</div> 
<div> 
    <span class="r" id="pg1"/> 
    <span class="r" id="pg2"/> 
    ... 
    <span class="r" id="pg19"/> <!-- total pages in second group --> 
</div> 
<div>...</div> 

因此,解決辦法應該是比你想的簡單得多。您不需要任何變量或複雜的XPath表達式。下面是應該產生一個結果的完整樣式類似於你所期望的:

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

    <xsl:template match="numberGroup"> 
     <div> 
      <xsl:apply-templates select="document(entry/file)//page"/> 
     </div> 
    </xsl:template> 

    <xsl:template match="page"> 
     <span class="r" id="pg{position()}"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

謝謝。啓蒙。我會弄清楚如何將它融入到我的實際項目中,這個項目相當長,當然比上面更復雜一些。 – Erik