在.NET中使用document()函数XSLT会生成错误

Sim*_*mon 3 c# xml xslt

我想在我的XSLT文件中使用嵌入式资源,但在调用'document(...)'时,C#抱怨"加载文档时出错......"

我想在XSLT文件中使用已定义的资源并通过它获取它们:"document('')/ / my:resources / "...

我怎样才能做到这一点??

ex xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:my="xslt-gruper-v1.2.xsl" exclude-result-prefixes="my">

     <my:resources>
      <one>tryb</one>
     </my:resources>

     <xsl:variable name="res" select="document('')/*/my:resources/("/>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

如何在C#中无异常地访问此类结构?我将在静态转换期间通过ex添加.Opera一切正常.

Dim*_*hev 10

<xsl:variable name="res" select="document('')/*/my:resources/("/>
Run Code Online (Sandbox Code Playgroud)

select属性的值不是语法正确的XPath表达式.每个兼容的XSLT处理器都必须引发错误.

方案:

纠正以上内容:

<xsl:variable name="vRes" select="document('')/*/my:resources"/>
Run Code Online (Sandbox Code Playgroud)

如果仍然存在异常,请阅读有关XsltSettings类的信息.

然后使用此构造函数创建XsltSettings的实例,如下所示:

XsltSettings(true, false)
Run Code Online (Sandbox Code Playgroud)

不要启用脚本 - 将构造函数的第二个参数保留为false.

以下是更完整的代码段:

// Create the XsltSettings object with document() enabled and script disabled.
XsltSettings settings = new XsltSettings(true,false);

// Create the XslCompiledTransform object and load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("sort.xsl", settings, new XmlUrlResolver());
Run Code Online (Sandbox Code Playgroud)

更新:出现错误的另一个可能原因是在内存中动态创建XSLT样式表(不是来自文件).在这种情况下,XSLT处理器通常无法解析相对uri document('').

在最后一种情况下,解决方案是使xsl:variable有用元素成为an的内容,并使用xxx:node-set()扩展函数来处理此元素.