Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使xsl:value成为动态的?_Php_Xml_Xslt - Fatal编程技术网

Php 如何使xsl:value成为动态的?

Php 如何使xsl:value成为动态的?,php,xml,xslt,Php,Xml,Xslt,考虑一下,输出/root/name。我要传递给的值的计算表达式,因此它选择XML中的特定值 我想让整个代码工作: XML: <?xml version="1.0" encoding="UTF-8" ?> <root> <xsl:value-of select="/root/name"/> <name>Foo</name> </root> <xsl:template match="xsl:value-o

考虑一下,
输出
/root/name
。我要传递给的
值的计算表达式,因此它选择XML中的特定值

我想让整个代码工作:

XML:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <xsl:value-of select="/root/name"/>
    <name>Foo</name>
</root>
<xsl:template match="xsl:value-of">                                                                                                                                                                        
    <xsl:element name="{name()}">                                                                                                                                                                          
        <xsl:attribute name="select">
            <xsl:value-of select="@select"/>
        </xsl:attribute>                                                                                                                                                
    </xsl:element>                                                                                                                                                                                         
</xsl:template> 
XSL:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <xsl:value-of select="/root/name"/>
    <name>Foo</name>
</root>
<xsl:template match="xsl:value-of">                                                                                                                                                                        
    <xsl:element name="{name()}">                                                                                                                                                                          
        <xsl:attribute name="select">
            <xsl:value-of select="@select"/>
        </xsl:attribute>                                                                                                                                                
    </xsl:element>                                                                                                                                                                                         
</xsl:template> 

所需输出:
Foo

但它不输出任何内容,或者使用另一个解决方案只输出
/root/name

甚至可以让这个代码工作吗?我使用XSLT1.0


谢谢

不,需要XSLT 3.0。

首先,您的输入不是XML:如果不将前缀绑定到名称空间,就不能有前缀

更重要的是,
select
属性的值是字符串
“/root/name”
。在XSLT 1.0或2.0中,不能将字符串作为XPath表达式求值(除非您的处理器碰巧支持某种类型的
evaluate()
extension函数*)

我不确定你到底想在这里实现什么,但我怀疑你需要重新思考你的战略。也许您需要从从输入文档生成XSLT样式表开始,然后在第二次传递中将该样式表应用于输入


(*)例如,使用
libxslt
Xalan-J
处理器,您可以处理以下格式良好的输入:

XML

<root xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:value-of select="/root/name"/>
    <name>Foo</name>
</root>
使用以下样式表:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/root">
    <results>
        <xsl:apply-templates select="xsl:value-of"/>
    </results>
</xsl:template>

<xsl:template match="xsl:value-of">
    <result>
        <xsl:value-of select="dyn:evaluate(@select)"/>
    </result>
</xsl:template> 

</xsl:stylesheet>

获得:

结果

<?xml version="1.0" encoding="UTF-8"?>
<results>
  <result>Foo</result>
</results>

请发布一个可复制的示例,包括XML输入和预期输出-请参阅:。@michael.hor257k编辑:)