XSL包含XSL以注册名称空间以处理包含XSL前缀的xpath

时间:2014-06-05 15:31:09

标签: xml xslt xpath xml-namespaces exslt

行。对于我的写作我很抱歉,但是我正在做的是为了处理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”这样的东西? 或者是否可以使用目录文件来修复??? 或者也许我可以使用某种进口或包括???

最好的问候

马库斯

1 个答案:

答案 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 选择器中使用的前缀。