您将 XSLT1.0 与 EXSLT ( http://www.exslt.org/ ) 一起使用,在您的样式表中定义为xmlns:str="http://exslt.org/strings"
. 该行声明了一个包含字符串<xsl:variable name="tokens" select="str:tokenize($images, ',')" />
的变量。<token>foo.jpg</token><token>bar.jpg</token>
因此,现在您可以使用此变量来选择或比较您的源 XML 标记值/属性。
您误解了<xsl:key>
元素的含义。它声明了一个可以与key()
函数一起使用的命名键。当你像这样使用这个函数时<xsl:for-each select="key('name', 'value')" />
,它会遍历你的源 XML 节点,它是由元素的match
属性声明的,并在指定的属性中搜索值。它不能用于在 XSL 变量内部进行搜索,而且完全没用。<xsl:key>
use
看看这个例子:
测试.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>
测试.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>
测试.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>