2

ファイル名のセットを含む文字列があります。

"foo.jpg,bar.jpg"

これを XSL スタイルシートに渡します。

<xsl:param name="images"/>

これらのファイル名に何らかの方法で XSLT キーを作成できますか?

私はこれを試しました;

<xsl:variable name="tokens" select="str:tokenize($images, ',')"/>
<xsl:key name="mykey" match="$tokens/*" use="token"/>

しかし、エラーが発生します。

Warning: XSLTProcessor::importStylesheet(): compilation error: file
file:///C:/root/sites/bec/ line 105 element key
in C:\root\php\lib-2013-04-23.php on line 157
Warning: XSLTProcessor::importStylesheet(): xsl:key : XPath pattern
compilation failed '//$tokens/*'

PHP の libxml (バージョン 2.7.3) のおかげで XSLT 1.0 を使用しています。

4

1 に答える 1

4
  1. スタイルシートで として定義されているEXSLT ( http://www.exslt.org/ ) でXSLT1.0 を使用していますxmlns:str="http://exslt.org/strings"。この<xsl:variable name="tokens" select="str:tokenize($images, ',')" />行は、文字列を保持する変数を宣言してい<token>foo.jpg</token><token>bar.jpg</token>ます。したがって、この変数を使用して、ソース XML タグの値/属性を選択または比較できます。

  2. <xsl:key>要素の意味を誤解しています。関数で使用できる名前付きキーを宣言しkey()ます。この関数を のように使用すると、要素の属性によって宣言されたソース XML ノード<xsl:for-each select="key('name', 'value')" />を繰り返し処理し、指定された属性内の値を検索します。XSL 変数内の検索には使用できず、まったく役に立ちません。match<xsl:key>use

次の例を見てください。

test.xml

<root>
  <img src="foo.jpg" width="128" height="128" alt="First ldpi image" />
  <img src="my.jpg" width="64" height="64" alt="My image" />
  <img src="foo.jpg" width="256" height="256" alt="First hdpi image" />
  <img src="your.jpg" width="64" height="64" alt="Your image" />
  <img src="bar.jpg" width="128" height="128" alt="Second image" />
</root>

test.xsl

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

  <xsl:param name="images" />
  <xsl:variable name="tokens" select="str:tokenize($images, ',')"/>

  <xsl:key name="mykey" match="img" use="@src"/>

  <xsl:template match="/">
    <root>
      <by-key>
        <xsl:copy-of select="key('mykey', 'my.jpg')" />
      </by-key>
      <by-node-set>
        <xsl:apply-templates />
      </by-node-set>
    </root>
  </xsl:template>

  <xsl:template match="/root/img[@src]">
    <xsl:if test="exsl:node-set($tokens)/text() = @src">
      <xsl:copy-of select="."/>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

test.php:

<?php

$xml = new DOMDocument('1.0', 'UTF-8');
$result = $xml->load('test.xml');

$xsl = new DOMDocument('1.0', 'UTF-8');
$result = $xsl->load("test.xsl");

$xslt = new XSLTProcessor();
$xslt->setParameter('', 'images', 'foo.jpg,bar.jpg');
$xslt->importStylesheet($xsl);
file_put_contents('result.xml', $xslt->transformToXML($xml));

?>

結果.xml

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:exsl="http://exslt.org/common" xmlns:str="http://exslt.org/strings">
  <by-key>
    <img src="my.jpg" width="64" height="64" alt="My image"/>
  </by-key>
  <by-node-set>
    <img src="foo.jpg" width="128" height="128" alt="First ldpi image"/>
    <img src="foo.jpg" width="256" height="256" alt="First hdpi image"/>
    <img src="bar.jpg" width="128" height="128" alt="Second image"/>
  </by-node-set>
</root>
于 2013-11-02T14:21:13.883 に答える