2012-04-08 5 views
3

Для того чтобы использовать xpath-functions (в частности, fn часть), я включил соответствующее пространство имен в моей таблице стилей XSLT, например так:Как вы можете использовать xpath-функции с XSLT 2.0?

<xsl:stylesheet 
    version="2.0" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
> 

В specified W3C.

Однако, когда я использую fn:document-uri, мои XSLT двигатели говорят мне, что я назвал неизвестную функцию/расширение:

<xsl:variable name="uri" select="fn:document-uri()" /> 

Опера говорит:

This document had an invalid XSLT stylesheet. Error message from the XSLT engine:
Error: XPath expression compilation failed: fn:document-uri()
Details: compilation error (characters 1-17, "fn:document-uri()"): unknown function called: '{ http://www.w3.org/2005/xpath-functions , document-uri }'

Firefox говорит:

Error during XSLT transformation: An unknown XPath extension function was called.

И xsltproc отказывается от трансформации, из-за xslt 2.0.

Итак, как правильно указать пространство имен fn?

+0

Bitmask, мой ответ предоставил вам информацию, или у вас еще есть вопрос по этому вопросу? –

+0

@DimitreNovatchev: Технически у вас есть, но обходным решением было бы здорово (хотя я не думаю, что это возможно). Вот почему я оставил вопрос открытым дольше. – bitmask

+0

Я четко сказал, что * совместимый * XSLT 1.0 процессор * не должен * реализовывать функции XPath 2.0. Это очень ясно означает, что нет «обходного пути» - если вам нужен XPath 2.0 в XSLT, то они * должны * использовать процессор XSLT 2.0 (или верхнюю версию). –

ответ

4

Проблема в том, что вы используете процессор XSLT 1.0, а процессор XSLT 1.0 не знает (и не должен знать) ничего о функциях XPath 2.0.

Если вы используете настоящий процессор XSLT 2.0, вам даже не нужно указывать пространство имен функций - это пространство имен по умолчанию для любого неперечисленного имени функции.

Например, это преобразование XSLT 2.0:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:sequence select="document-uri(.)" /> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:sequence select="document-uri(document(''))" /> 
</xsl:template> 
</xsl:stylesheet> 

при исполнении с Saxon 9.1.5 под XSelerator, производит правильно URL-адреса документа XML источника и саму таблицу стилей:

file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xml 
file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xsl 
-3

вы можете использовать функцию XPath в PHP пожалуйста, обратитесь по ссылке http://php.net/manual/en/simplexmlelement.xpath.php Я думаю, этот пример полезный для вас

+3

Этот вопрос касался вызова функций XPath 2.0 внутри таблицы стилей XSLT, а не функций PHP для оценки выражения XPath. –

Смежные вопросы