Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
Xml xslt中的文档函数_Xml_Xslt - Fatal编程技术网

Xml xslt中的文档函数

Xml xslt中的文档函数,xml,xslt,Xml,Xslt,我正在使用.NET4代码触发转换 当我直接在xslt中使用document函数编写xpath时,转换工作得很好。请参见示例xslt中的元素PanelOK: 但是,当xPath本身存储在变量中时,它将不起作用。请参见元素PanelException: <xsl:value-of select="@Customer"/> 其中@Customer具有值文档“myXml.xml”/COM:root/COM:Global/@Customer 然后,我用一个脚本扩展了xslt。当我不在xpa

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

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

但是,当xPath本身存储在变量中时,它将不起作用。请参见元素PanelException:

<xsl:value-of select="@Customer"/>
其中@Customer具有值文档“myXml.xml”/COM:root/COM:Global/@Customer

然后,我用一个脚本扩展了xslt。当我不在xpath中使用document函数(例如仅/COM:root/COM:Global/@Customer)时,这可以很好地工作。但是对于document函数,我得到了一个异常,因为一个未知函数,这个查询需要XsltContext

以下是示例:xml1的属性customer的值包含xpath表达式,xml2是可以找到该值的文件,xslt是一种转换,它转换xml1并计算存储在属性customer中的xpath表达式,该属性应使用自定义脚本在xml2中查找值,然后在select语句中执行。我必须做什么才能让它工作

xml1:

xml2:

xslt:

恐怕XPath规范中没有定义document函数,因此在XPath 1.0实现(如Microsoft的XPathNavigator)中不可用。文档函数仅在XSLT中定义

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

EXSLT函数dyn:evaluate未在microsoft XSLT处理器中实现

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

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


即使在XSLT 2.0/XPath2.0中,也不支持XPath表达式的动态计算。这种支持可能在更高版本中可用,但3.0版本仍具有工作草稿状态。

好问题,+1。请参阅我的答案,以了解为什么没有扩展就不可能做到这一点,而在今天的.NET xslt处理器中根本不可能做到这一点。解决方法是可能的,如果您表示对此感兴趣(可能会提出一个新问题并将其定义为尽可能具体),我很乐意提供此类解决方法。首先,内联扩展函数定义不是标准的XSLT内容模型。第二,您正在尝试将和XSLT函数与XPath引擎一起使用。除了两步转换的经典解决方案,样式表将输入源转换为一个新的样式表,输出最终结果和简单的遍历模板,我还建议将信息分为两部分:路径和文档,如中所示。还请注意,有人努力为XPath评估提供XSLT上下文:,@Dimitre:我对解决办法很感兴趣。我发布了一个新问题。。。
<?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>
<?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>
<?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>