2012-12-13 31 views
1

我想根據不同的參數應用不同的模板。我不知道如何用xslt實現這一點。我使用php中的setParameter()來設置參數。我可以使用param在xsl中執行此操作,如果是這樣,怎麼辦?或者有更好的方法嗎?根據參數應用不同的XSLT模板

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

<xsl:param name="name"></xsl:param> 

<xsl:template match="1"> 

    </xsl:template> 

    <xsl:template match="2"> 

    </xsl:template> 

    </xsl:stylesheet> 

回答

0

燁,你可以使用這樣的事情:

$xml = file_get_contents('test.xml'); 

# LOAD XML FILE 
header('Content-Type: text/html; charset=UTF-8'); 
$XML = new DOMDocument('1.0', 'UTF-8'); 
$XML->loadXML($xml); 

# START XSLT 
$xslt = new XSLTProcessor(); 
$XSL = new DOMDocument('1.0', 'UTF-8'); 
$XSL->load('test.xsl'); 
$xslt->importStylesheet($XSL); 
print $xslt->transformToXML($XML); 

有了這個,你可以使用任何你想要的XSLT無所添加到源XML。您需要啓用PHP DOM並在您的PHP安裝中使用--enable-libxml

這個想法是:而不是改變XSLT做更多的東西,實現多個更小的XSLT並選擇你需要的。

如果你想使用你需要做這樣的PHP參數傳遞給XSLT:

$xslt = new XSLTProcessor(); 
$xslt->setParameter('', 'owner', $name); 
1

你可以使用不同的模式。在XSLT 1.0中,你需要一個開關:

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

    <xsl:param name="name"/> 

    <xsl:template match="/"> 
    <xsl:choose> 
     <xsl:when test="$name='1'"> 
     <xsl:apply-templates select="." mode="mode1"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:apply-templates select="." mode="mode2"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

    <xsl:template match="/" mode="mode1"> 
    ... 
    </xsl:template> 

    <xsl:template match="/" mode="mode2"> 
    ... 
    </xsl:template> 

</xsl:stylesheet> 

在XSLT 2.0,這是可能的匹配模式使用的參數,如

<xsl:template match="*[$test='1']"> 

</xsl:template> 

,但使用的模式會是更好的選擇,也。請注意,無論何時定義模板或致電<apply-templates>,都需要設置正確的模式。如果您有兩個處理分支共有的模板,那麼您可以給他們一個模式名稱,如common或讓它們無模式。請再次注意,只有在使用<apply-templates>時使用了正確的模式(無論是mode1,mode2,common還是無模式),它們纔會被應用。