2016-08-29 67 views
1

我正嘗試使用xsl轉換基於XML配置文件生成XSL文件。PHP - 是否有可能使用xslt轉換將XML文件轉換爲XSL文件

這是我的意見。

<front> 
    <sample1/> 
    <sample2/> 
    <sample3> 
     <item1/> 
     <item2/> 
     <item3/> 
     <item4/> 
    </sample3> 
    <sample4/> 
</front> 

我期待着得到XSL文件一樣,

<xsl:template match="//div[@class='front']"> 
    <xsl:apply-templates select=".//*[@class='sample1']"/> 
    <xsl:apply-templates select=".//*[@class='sample2']"/> 
    <xsl:apply-templates select=".//*[@class='sample3']"/> 
    <xsl:apply-templates select=".//*[@class='sample4']"/> 
</xsl:template> 
<xsl:template match="//*[@class='sample3']"> 
    <xsl:apply-templates select=".//*[@class='item1']"/> 
    <xsl:apply-templates select=".//*[@class='item2']"/> 
    <xsl:apply-templates select=".//*[@class='item3']"/> 
    <xsl:apply-templates select=".//*[@class='item4']"/> 
</xsl:template> 

難道這可以使用XSL轉換來完成?主要思想是每次在配置文件中進行更改時,我都不需要編寫xsl文件。它應該被生成。如果我作出這樣,

<front> 
     <sample1/> 
     <sample2/> 
     <sample4/> 
     <sample3> 
      <item1/> 
      <item2/> 
      <item4/> 
      <item3/> 
     </sample3> 
    </front> 

改變了xsl應,

<xsl:template match="//div[@class='front']"> 
    <xsl:apply-templates select=".//*[@class='sample1']"/> 
    <xsl:apply-templates select=".//*[@class='sample2']"/> 
    <xsl:apply-templates select=".//*[@class='sample4']"/> 
    <xsl:apply-templates select=".//*[@class='sample3']"/> 
</xsl:template> 
    <xsl:template match="//*[@class='sample3']"> 
    <xsl:apply-templates select=".//*[@class='item1']"/> 
    <xsl:apply-templates select=".//*[@class='item2']"/> 
    <xsl:apply-templates select=".//*[@class='item4']"/> 
    <xsl:apply-templates select=".//*[@class='item3']"/> 
</xsl:template> 

任何幫助將不勝感激。提前致謝!

回答

2

存在使用XSLT生成在XSLT規範本身sttylesheet的示例:https://www.w3.org/TR/xslt/#element-namespace-alias

嘗試類似:

XSLT 1.0

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

<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/> 

<xsl:template match="/"> 
    <axsl:stylesheet version="1.0"> 
     <xsl:apply-templates/> 
    </axsl:stylesheet> 
</xsl:template> 

<xsl:template match="/*"> 
    <axsl:template match="div[@class='{name()}']"> 
     <xsl:apply-templates mode="apply"/> 
    </axsl:template> 
    <xsl:apply-templates select="*[*]"/> 
</xsl:template> 

<xsl:template match="*"> 
    <axsl:template match="*[@class='{name()}']"> 
     <xsl:apply-templates mode="apply"/> 
    </axsl:template> 
    <xsl:apply-templates select="*[*]"/> 
</xsl:template> 

<xsl:template match="*" mode="apply"> 
    <axsl:apply-templates select=".//*[@class='{name()}']"/> 
</xsl:template> 

</xsl:stylesheet> 

  1. 領先的//在匹配模式中是完全多餘的;

  2. 您確定要在您的xsl:apply-templates 表達式中使用.//嗎?