2011-01-06 44 views
0

我有一個輸入文件合併可依使用模板到一個通用模板

main.xml中

<?xml version="1.0" encoding="utf-8" ?> 
<Employees> 
<Employee> 
<id name="id">1</id> 
<firstname >ABC</firstname> 
<lastname >XYZ</lastname> 
<age >32</age> 
</Employee> 
</Employees> 

和2查找文件:

Lookup1.xml

<?xml version="1.0" encoding="utf-8"?> 
    <Employees> 
    <Employee id="1"> 
    <department code="102">HR</department> 
    </Employee> 
    </Employees> 

LOOKUP2。 xml

<?xml version="1.0" encoding="utf-8"?> 
    <Employees> 
    <Employee id="1"> 
    <Country code="10">Canada</Country> 
    </Employee> 
    </Employees> 

我想要一個輸出中insuch的方式,我通過一個逗號seprated值劇本如「國家,部門」,它應該產生以下輸出

<?xml version="1.0" encoding="utf-8" ?> 
    <Employees> 
    <Employee> 
    <id name="id">1</id> 
    <firstname >ABC</firstname> 
    <lastname >XYZ</lastname> 
    <age >32</age> 
    <va-object> 
    <va-metadata> 
    <related-content-ref area="decisions" 
     cite="102" 
     relationship="department" relevance="100"/> 
    <primary-class> 
     <super-class super-class="value-add"/> 
     <sub-class sub-class="department">HR</sub-class> 
    </primary-class> 
    </va-metadata> 
</va-object> 
<va-object> 
    <va-metadata> 
    <related-content-ref area="decisions" 
     cite="10" 
     relationship="country" relevance="100"/> 
    <primary-class> 
     <super-class super-class="value-add"/> 
     <sub-class sub-class="country">Canada</sub-class> 
    </primary-class> 
    </va-metadata> 
</va-object> 
    </Employee> 
    </Employees> 

但如果我只是通過「國家」作爲參數那麼腳本不應該插入部門或反之亦然。我可以通過有2個不同的tempaltes國家和部門來實現這一目標,但我希望通過使用一個具有來自外部文件的參數的通用模板來達到此目的。任何幫助將不勝感激。

+0

我建議你減少這到最小的一組有效的xsl來演示你想要實現什麼,並提供示例XML輸入和輸出。沒有人會嘗試去理解100行沒有XML上下文的複雜xsl。 – 2011-01-06 20:15:54

回答

0

這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kElemByParentId" match="Employee/*" use="../@id"/> 
    <xsl:param name="pNames" select="'Country department'"/> 
    <xsl:variable name="vNames" select="concat(' ',$pNames,' ')"/> 
    <xsl:variable name="vLookup" select="document('Lookup1.xml')| 
             document('Lookup2.xml')"/> 
    <xsl:variable name="vUpper" select="'QWERTYUIOPASDFGHJKLZXCVBNM'"/> 
    <xsl:variable name="vLower" select="'qwertyuiopasdfghjklzxcvbnm'"/> 
    <xsl:template match="node()|@*" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Employee/*[last()]"> 
     <xsl:variable name="vKey" select="../id"/> 
     <xsl:call-template name="identity"/> 
     <xsl:for-each select="$vLookup"> 
      <xsl:apply-templates select="key('kElemByParentId',$vKey) 
              [contains($vNames, 
                concat(' ',name(),' '))]" 
           mode="va-object"/> 
     </xsl:for-each> 
    </xsl:template> 
    <xsl:template match="*" mode="va-object"> 
     <xsl:variable name="vName" 
         select="translate(name(),$vUpper,$vLower)"/> 
     <va-object> 
      <va-metadata> 
       <related-content-ref area="decisions" 
            cite="{@code}" 
            relationship="{$vName}" 
            relevance="100"/> 
       <primary-class> 
        <super-class super-class="value-add"/> 
        <sub-class sub-class="{$vName}"> 
         <xsl:value-of select="."/> 
        </sub-class> 
       </primary-class> 
      </va-metadata> 
     </va-object> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<Employees> 
    <Employee> 
     <id name="id">1</id> 
     <firstname>ABC</firstname> 
     <lastname>XYZ</lastname> 
     <age>32</age> 
     <va-object> 
      <va-metadata> 
       <related-content-ref area="decisions" 
            cite="102" 
            relationship="department" 
            relevance="100" /> 
       <primary-class> 
        <super-class super-class="value-add" /> 
        <sub-class sub-class="department">HR</sub-class> 
       </primary-class> 
      </va-metadata> 
     </va-object> 
     <va-object> 
      <va-metadata> 
       <related-content-ref area="decisions" 
            cite="10" 
            relationship="country" 
            relevance="100" /> 
       <primary-class> 
        <super-class super-class="value-add" /> 
        <sub-class sub-class="country">Canada</sub-class> 
       </primary-class> 
      </va-metadata> 
     </va-object> 
    </Employee> 
</Employees> 

注意: 「按順序」 的XPath 1.0測試:

contains(concat($separator,$sequence,$separator), 
     concat($separator,$item,$separator))