2013-07-20 21 views
2

我有一个字符串,其中包含一组文件名,例如;可以在一组字符串标记上创建XSLT键吗?

"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. 您使用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标记值/属性。

  2. 您误解了<xsl:key>元素的含义。它声明了一个可以与key()函数一起使用的命名密钥。当你使用像<xsl:for-each select="key('name', 'value')" />此功能,它通过你的源XML节点迭代,至极被<xsl:key>元素的match属性声明,并搜索指定use属性里面的值。 它不能用于在XSL变量内搜索,而且它完全没用。

看看这个例子:

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

?> 

为result.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> 
+0

感谢一个非常明确和详细的解答。 –

相关问题