1

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

2 回答 2

2

您可以使用不同的模式。在 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或无模式)时应用。mode2common

于 2012-12-13T12:28:08.610 回答
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 添加任何内容。您需要--enable-libxml在 PHP 安装中启用 PHP DOM。

这个想法是:与其更改 XSLT 来做更多的事情,不如实现多个较小的 XSLT 并选择您需要的一个。

如果您想使用 PHP 将参数传递给 XSLT,您需要这样做:

$xslt = new XSLTProcessor();
$xslt->setParameter('', 'owner', $name);
于 2012-12-13T11:33:16.540 回答