2013-07-20 20 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

感謝一個非常明確和詳細的解答。 –

相關問題