根据参数应用不同的XSLT模板

时间:2012-12-13 11:15:25

标签: php xslt

我想根据不同的参数应用不同的模板。我不知道如何使用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>

2 个答案:

答案 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>使用正确模式(mode1mode2common或无模式)时才会应用它们。

答案 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);