我有一個像這樣的結構的XML文檔。使用XSLT 1.0,我該如何編寫一個模板來處理平面XML記錄中的編號屬性?
<Document>
<record>
<field name="Dep1FirstName">Frank</field>
<field name="Dep1MiddleName"/>
<field name="Dep1LastName">Billings</field>
<field name="Dep1DoB">1952-01-20</field>
<field name="Dep1Gender"/>
<field name="Dep2Prefix"/>
<field name="Dep2FirstName"/>
<field name="Dep2MiddleName"/>
<field name="Dep2LastName"/>
</record>
<record>
<field name="Date_of_Birth">1978-09-20</field>
<field name="Dep1FirstName"/>
<field name="Dep1MiddleName"/>
<field name="Dep1LastName"/>
<!-- many more -->
</record>
</Document>
元素(代表一個因每個號碼)可以達到十個,所以我真的想寫一個模板來處理每個分組(編號)的家屬。如果沒有該組的數據,我不會複製它(人可能只有兩個家屬而不是十個)。例如,我只會使用Dep1。到目前爲止,我已經提出了這樣的事情:
<xsl:template match="ns:Document">
<div class="container">
<xsl:apply-templates select="ns:Content"/>
</div>
</xsl:template>
<xsl:template match="ns:record">
<div class="page">
<div>
<xsl:apply-templates/>
</div>
</div>
</xsl:template>
<xsl:template match="ns:field[@name='Dep1FirstName' and text()]">
<div class="dependents_info">
<xsl:apply-templates select="../ns:field[contains(@name,'Dep') and contains(@name,'1')" mode="secondary"/>
</div>
</xsl:template>
<!-- make per dependent template (can be up to ten per schema) -->
<xsl:template match="ns:field[contains(@name,'Dep') and contains(@name,'$NUMBER') and contains(@name,'FirstName')]" mode="secondary">
<div class="dependent">
<xsl:value-of select="."/>
<xsl:value-of select="../ns:field[@name='Dep$NUMBERLastName']" />
...
</div>
</xsl:template>
的$數量將需要爲每個10(假定存在依賴性)的更新。有沒有一種乾淨的方式來做到這一點,而不是爲每個違反DRY的數字寫一個模板(不要重複自己)?
編輯:我更新了很多更詳細的源文件的結構,因爲問題的答案已經與依賴於像xsl:key這樣的全局變量的答案相結合,因此,其餘的文檔結構是比我原先想象的更有意義。
我不明白你的問題。 「一個模板處理每個分組(數字)」是什麼意思? –
另外,請發佈整個XML和XSL。您引用了名稱空間謂詞ns:,但不顯示字段元素的父項。而通過分組,你的意思是#在Dep#中......? – Parfait
是的,該組是由#中的屬性值。實際的XML文檔和XSL片是巨大的,所以我真的試圖削減下來到最低限度,給的什麼,我試圖做的感覺。不幸的是,生成XML文檔的工具超級有限,所以記錄只是手動複製。 – lithiumfrost