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编辑:)