首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xslt中的文档函数

xslt中的文档函数
EN

Stack Overflow用户
提问于 2011-02-04 16:06:13
回答 2查看 2.6K关注 0票数 1

我正在使用.NET4代码触发转换。

当我直接在xslt中使用文档函数编写xpath时,转换工作得很好(参见xslt示例中的PanelOK元素):

但是,当xPath本身存储在变量中时,它将无法工作(参见元素PanelException):

代码语言:javascript
复制
<xsl:value-of select="@Customer"/>

其中@Customer的值为"document('myXml.xml')/COM:root/COM:Global/@Customer“

然后,我用脚本扩展了xslt。当我不使用xpath中的文档函数(例如,仅/COM:root/COM:Global/@Customer )时,这种方法工作得很好。但是,对于文档函数,由于一个未知的函数,这个查询需要异常XsltContext。

下面是示例: xml1具有包含xpath表达式的值的属性customer,xml2是可以找到值的文件,xslt是转换xml1并计算存储在属性customer中的xpath表达式的转换,该转换应该使用自定义脚本查找xml2中的值,然后使用select语句中的excpetion。我该怎么做才能让这件事奏效?

xml1:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<SFK:root xmlns:SFK="http://www.Test.com/SoftKeys">
  <SFK:Panel Customer="document('setting.xml')/COM:root/COM:Global/@Customer">
  </SFK:Panel>
</SFK:root>

xml2:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<COM:root xmlns:COM="http://www.Test.com/Comm">
  <COM:Global Customer="Microsoft">
  </COM:Global>
</COM:root>

xslt:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:dyn="http://exslt.org/dynamic"
                xmlns:SFK="http://www.Test.com/SoftKeys"
                xmlns:COM="http://www.Test.com/Comm"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                extension-element-prefixes="dyn msxsl"
                exclude-result-prefixes="msxsl xsl SFK COM dyn">

    <!--Script to evaluate a string xPath to a Node. the real evaluate extension is not implemented in MS xslt processor-->
    <msxsl:script implements-prefix="dyn" language="C#">
        <![CDATA[
            public XPathNodeIterator evaluate(XPathNavigator context, string expression)
            {
                XmlNamespaceManager mngr = new XmlNamespaceManager(new NameTable());
                mngr.AddNamespace("SFK","http://www.Test.com/SoftKeys");
                mngr.AddNamespace("COM","http://www.Test.com/Comm");
                mngr.AddNamespace("msxsl","urn:schemas-microsoft-com:xslt");

                return context.Select(expression,mngr); // here occurs the exception
            }
        ]]>
    </msxsl:script>

    <xsl:output method="xml" version="1.0"  encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
         <xsl:apply-templates select="current()/SFK:root/SFK:Panel"/>
    </xsl:template>
    <xsl:template match="SFK:Panel">
        </PanelOk>
            <xsl:value-of select="document('xml2.xml')/COM:root/COM:Global/@Customer"/>
         </PanelOk>
         </PanelException>
            <xsl:value-of select="dyn:evaluate(., @Customer)"/>
         </PanelException>     
    </xsl:template>
</xsl:stylesheet>
EN

回答 2

Stack Overflow用户

发布于 2011-02-04 16:23:38

恐怕document函数没有在XPath规范中定义,因此在微软的XPathNavigator等XPath 1.0实现中不可用。document函数仅在XSLT中定义。

对于Saxon 9或XQSharp,我不知道您可以使用XPath 2.0 doc函数,但我不确定您是否希望从.NET框架内置的XSLT和XPath 1.0实现转移到第三方XSLT和XPath 2.0实现。

票数 1
EN

Stack Overflow用户

发布于 2011-02-04 16:59:21

EXSLT函数dyn:evaluate 不是在microsoft处理器中实现的。

如果所需的XPath表达式的不同部分在xml1的不同元素/属性中编码,则可以解决这一问题。

当然,这是一个非常有限的解决方案,需要约定和纪律。

即使在XSLT2.0/XPath2.0中,也不支持对XPath表达式进行动态计算。这种支持可以在以后的版本中获得,但3.0版本仍然具有“工作草案”状态。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4900099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档