我想根据不同的参数应用不同的模板。我不知道如何使用xslt实现这一目标。我使用php中的setParameter()来设置参数。我可以使用param在xsl中执行此操作,如果是这样,怎么做?还是有更好的方法吗?
<?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 :(得分: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
或无模式)时才会应用它们。
答案 1 :(得分: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安装中启用PHP DOM并--enable-libxml
。
这个想法是:不是改变XSLT来做更多的事情,而是实现多个更小的XSLT并选择你需要的XSLT。
如果你想使用PHP将参数传递给XSLT,你需要这样做:
$xslt = new XSLTProcessor();
$xslt->setParameter('', 'owner', $name);