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場合mode2にのみ適用されることに注意してcommonください。

于 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 );

これにより、ソース XML に何も追加することなく、任意の xslt を使用できます。--enable-libxmlPHP DOM を有効にし、PHP をインストールする必要があります。

アイデアは、XSLT を変更してより多くのことを行うのではなく、複数の小さな XSLT を実装し、必要なものを選択することです。

PHP を使用して XSLT にパラメーターを渡したい場合は、次のようにする必要があります。

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