2012-08-31 70 views
2

我有一個文件中的相應記錄的數據庫的幾條記錄。如何將元素插入到xslt中以前創建的元素中?

示例 記錄編號XML

  1. <XML_FILE_HEADER file_name="sample.txt" />
  2. <XML_RECORD record_number="1" name="John Doe" Age="21"/>
  3. <XML_RECORD record_number="2" name""Jessica Sanchez" Age="23"/>
  4. <XML_FILE_FOOTER total_records="2"/>

現在,每一個記錄我將創建XML格式的輸出文件的XSLT模板。

對於記錄無1:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt"> 
<xsl:output method="xml"/> 
<xsl:template match="XML_FILE_HEADER"> 
    <xsl:element name="File"> 
    <xsl:attribute name="FileName"><xsl:value-of select="@file_name"/></xsl:attribute> 
    </xsl:element> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

對於記錄2和3:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt"> 
    <xsl:output omit-xml-declaration="yes"/> 
    <xsl:template match="XML_RECORD"> 
     <xsl:element name="Record"> 
     <xsl:attribute name="Name"><xsl:value-of select="@name"/></xsl:attribute> 
     <xsl:element name="Details"> 
     <xsl:attribute name="Age"><xsl:value-of select="@Age"/></xsl:attribute> 
     </xsl:element> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

對於記錄4:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt"> 
    <xsl:output omit-xml-declaration="yes"/> 
    <xsl:template match="XML_FILE_FOOTER"> 
     <xsl:element name="Totals"> 
     <xsl:attribute name="Total Records"><xsl:value-of select="@total_records"/></xsl:attribute> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

與是問題是,我將有一個輸出在使用上述模板附加每條記錄之後:

<?xml version="1.0" encoding="UTF-8"?> 
<File FileName="sample.txt"></File> 
<Record Name="John Doe" Age="21"></Record> 
<Record Name="Jessica Sanchez" Age="22"></Record> 
<Totals Total Records="2"></Totals> 

我如何能夠將文件中的記錄和彙總元素插入?所以它會有這樣的輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<File FileName="sample.txt"> 
<Record Name="John Doe" Age="21"></Record> 
<Record Name="Jessica Sanchez" Age="22"></Record> 
<Totals Total Records="2"></Totals> 
</File> 

任何幫助將非常感激。謝謝。

回答

0

你想要的是<xsl:call-template name="templatename" />元素。這使您可以從另一個模板中調用模板。

喜歡的東西

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xslt"> 
    <xsl:output method="xml"/> 
    <xsl:template match="/XML_FILE/XML_FILE_HEADER"> 
     <xsl:element name="File"> 
     <xsl:attribute name="FileName"> 
      <xsl:value-of select="@file_name"/> 
     </xsl:attribute> 
     <xsl:for-each select="/XML_FILE/XML_RECORD"> 
      <xsl:call-template name="RecordTemplate" /> 
     </xsl:for-each>   
     <xsl:call-template name="TotalTemplate" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template name="RecordTemplate"> 
     <xsl:element name="Record"> 
     <xsl:attribute name="Name"><xsl:value-of select="@name"/></xsl:attribute> 
     <xsl:attribute name="Age"><xsl:value-of select="@Age"/></xsl:attribute> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="/XML_FILE/XML_FILE_FOOTER" name="TotalTemplate"> 
     <xsl:element name="Totals"> 
      <xsl:attribute name="Total Records"><xsl:value-of select="@total_records"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
當然

你輸入你要XML有效(即有一個根節點),像這樣

<XML_FILE> 
    <XML_FILE_HEADER file_name="sample.txt" /> 
    <XML_RECORD record_number="1" name="John Doe" Age="21"/> 
    <XML_RECORD record_number="2" name""Jessica Sanchez" Age="23"/> 
    <XML_FILE_FOOTER total_records="2"/> 
</XML_FILE> 
2

作爲簡短易,因爲這

<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="/*"> 
    <xsl:apply-templates select="XML_FILE_HEADER"/> 
</xsl:template> 

<xsl:template match="XML_FILE_HEADER"> 
    <File FileName="{@file_name}"> 
    <xsl:apply-templates select="../*[not(self::XML_FILE_HEADER)]"/> 
    </File> 
</xsl:template> 

<xsl:template match="XML_RECORD"> 
    <Record name="{@name}" Age="{@Age}"/> 
</xsl:template> 

<xsl:template match="XML_FILE_FOOTER"> 
    <Totals TotalRecords="{@total_records}"/> 
</xsl:template> 
</xsl:stylesheet> 

When this transf ormation上提供的XML應用(校正爲形成孔)文件:

<t> 
    <XML_FILE_HEADER file_name="sample.txt" /> 
    <XML_RECORD record_number="1" name="John Doe" Age="21"/> 
    <XML_RECORD record_number="2" name="Jessica Sanchez" Age="23"/> 
    <XML_FILE_FOOTER total_records="2"/> 
</t> 

有用,正確的結果產生

<File FileName="sample.txt"> 
    <Record name="John Doe" Age="21"/> 
    <Record name="Jessica Sanchez" Age="23"/> 
    <Totals TotalRecords="2"/> 
</File> 

說明

  1. 正確使用模板。

  2. 正確使用xsl:apply-templates來排序結果。

  3. 正確使用AVT(屬性值模板)。

  4. 避免使用xsl:element

  5. 沒有使用的xsl:call-template

  6. 幾乎完全在「推式」中實施。

+0

不錯的答案,upvoted。 –

+0

@JaimalChohan,不客氣。 –