行。对于我的写作我很抱歉,但是我正在做的是为了处理xPath而做的很奇怪。 我只使用xsltproc,所以只有XSLT 1.0和EXSLT才是我的工具。
我使用一个输入xml文件来获取我必须处理的更多xml文件。 这导致我不知道我正在应用的xsl中的前缀和命名空间。
我必须在输入的xml文件中使用“xPathes”(存储为属性)。 所以我必须使用EXSLT来评估(dyn:evaluate函数)xpathes加载到变量的文档:
<xsl:variable name="importedDocument" select="document('importDoc.xml')" />
形成importDoc:
<?xml version='1.0'?>
<bm:root xmlns:bm="http://my.bookmarks/ns/1.0" >
....
之后我想在我的xslt中使用xpath ......类似的东西:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:rs="http://ns.zf.com/xmlmerger/ruleset"
xmlns:dyn="http://exslt.org/dynamic"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="dyn rs exsl" >
....
<xsl:variable name="xpath" select="bm:root/bm:bookmarks[4]/@xpath" />
<xsl:for-each select="exsl:node-set($importedDocument)">
<xsl:if test="dyn:evaluate($xpath)" >
<xsl:value-of select="generate-id(dyn:evaluate($xpath))" />
</xsl:if>
</xsl:for-each>
但最后我从
收到了这条消息xmlXPathEval: evaluation failed
dyn:evaluate() : unable to evaluate expression 'bm:root/bm:bookmarks[4]/@xpath'
所以我需要像“autoregister namespaces”这样的东西? 或者是否可以使用目录文件来修复??? 或者也许我可以使用某种进口或包括???
最好的问候
马库斯
答案 0 :(得分:0)
您需要将命名空间添加到样式表中:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:rs="http://ns.zf.com/xmlmerger/ruleset"
xmlns:dyn="http://exslt.org/dynamic"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="dyn rs exsl"
xmlns:bm="http://my.bookmarks/ns/1.0">
实际上,您可以在样式表中使用所需的任何前缀。您声明的前缀是您在 XPath 选择器中使用的前缀。