2016-02-04 26 views
0

是否可以使用單個xsl將多個XML應用於具有不同根元素和select元素的多個XML?請指教。 原始XML-1:xslt傳遞模板匹配和運行時的每個值

<employees> 
<employee> 
<name>ABC</name> 
<id>123</id> 
<dept>sales</dept> 
<city>XYZ</city> 
</employee> 
</employees> 

的xsl:

<doc> 
<set> 
<field name="Name">ABC</field> 
<field name="Id">123</field> 
<field name="Department">sales</field> 
<field name="City">XYZ</field> 
</set> 
</doc> 

我想使用相同的xsl用於將下面的XML:

<xsl:template match="employees"> 

     <xsl:element name="doc"> 
      <xsl:for-each select="employee"> 

      <xsl:element name="set"> 
       <xsl:element name="field"> 
        <xsl:attribute name="name">Name</xsl:attribute> 
        <xsl:value-of select="name"/> 
       </xsl:element> 
       <xsl:element name="field"> 
        <xsl:attribute name="name">Id</xsl:attribute> 
        <xsl:value-of select="id"/> 
       </xsl:element> 
<xsl:element name="field"> 
        <xsl:attribute name="name">Department</xsl:attribute> 
        <xsl:value-of select="dept"/> 
       </xsl:element> 
<xsl:element name="field"> 
        <xsl:attribute name="name">City</xsl:attribute> 
        <xsl:value-of select="city"/> 
       </xsl:element> 
      </xsl:element> 
      </xsl:for-each> 
      </xsl:element> 

    </xsl:template> 

作爲這將產生輸出。

<customers> 
<customer> 
<name>DEF</name> 
<id>456</id> 
<city>DEF</city> 
</customer> 
</customers> 

我試圖使用變量和設置根元件和用於-每個通java程序在運行時選擇元件。但它給錯誤。

<xsl:variable name="rootElement"></xsl:variable> 
<xsl:variable name="subElement"></xsl:variable> 
    <xsl:template match="$rootElement"> 

     <xsl:element name="set"> 
      <xsl:for-each select="$subElement"> 

錯誤:

FATAL ERROR: 'line 4: Error parsing XPath expression '$rootElement'.' 
javax.xml.transform.TransformerConfigurationException: line 4: Error parsing XPath expression '$rootElement'. 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(Unknown Source) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(Unknown Source) 

任何人都可以請建議。謝謝。

+0

您只能在所有輸入文檔重複使用相同的XSLT將在您的示例中具有相同的層次結構:table/records/fields。 –

回答

0

東西考慮下面的通用版本,沒有員工或客戶的參考,但匹配模板根的孩子:

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

    <xsl:template match="/"> 
     <xsl:element name="doc"> 
      <xsl:apply-templates select="*"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="/*/*"> 
    <xsl:element name="set"> 
     <xsl:element name="field"> 
      <xsl:attribute name="name">Name</xsl:attribute> 
      <xsl:value-of select="name"/> 
     </xsl:element> 
     <xsl:element name="field"> 
      <xsl:attribute name="name">Id</xsl:attribute> 
      <xsl:value-of select="id"/> 
     </xsl:element> 
     <xsl:element name="field"> 
      <xsl:attribute name="name">Department</xsl:attribute> 
      <xsl:value-of select="dept"/> 
     </xsl:element> 
     <xsl:element name="field"> 
      <xsl:attribute name="name">City</xsl:attribute> 
      <xsl:value-of select="city"/> 
     </xsl:element> 
    </xsl:element> 
    </xsl:template> 

</xsl:transform> 
+0

謝謝@Parfait ..這是我正在尋找.. – KCMS

0

您可以使用union運算符。像

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="employees|customers"> 
     <xsl:element name="doc"> 
      <xsl:for-each select="employee|customer"> 
       <set> 
        <field name="Name"> 
         <xsl:value-of select="name"/> 
        </field> 
        <field name="Id"> 
         <xsl:value-of select="id"/> 
        </field> 
        <xsl:if test="dept"> 
         <field name="Department"> 
          <xsl:value-of select="dept"/> 
         </field> 
        </xsl:if> 
        <field name="City"> 
         <xsl:value-of select="city"/> 
        </field> 
       </set> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet>