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
Xml XSLT 1.0中Document()函数的使用_Xml_Xslt - Fatal编程技术网

Xml XSLT 1.0中Document()函数的使用

Xml XSLT 1.0中Document()函数的使用,xml,xslt,Xml,Xslt,我正在使用.NET代码触发转换 除非我将“EnableDocumentFunction”属性添加到XSL设置中,否则程序将抛出如下错误:。。“禁止使用Document()函数”” 实际上这个程序是不可编辑的,是一种只读的。。是否可以编辑XSL代码本身,以便使用document()函数 示例XSL和XML如下所示: 示例XML: 其他 和示例XML: <?xml version="1.0" encoding="utf-8"?> <root> <test_n

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

除非我将“
EnableDocumentFunction
”属性添加到XSL设置中,否则程序将抛出如下错误:。。“
禁止使用Document()函数”

实际上这个程序是不可编辑的,是一种只读的。。是否可以编辑XSL代码本身,以便使用document()函数

示例XSL和XML如下所示:
示例XML:


其他


和示例XML:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <test_node>California</test_node>
  <test_node>CA</test_node>
  <test_node> CA</test_node>
  <test_node>Texas</test_node>
  <test_node>TX</test_node>
  <test_node>CAA</test_node>
  <test_node></test_node>
</root>

加利福尼亚
加利福尼亚州
加利福尼亚州
得克萨斯州
德克萨斯州
民航局
这里的document()函数用于访问XSLT文档本身,并提取xsl:变量的内容。在这种情况下,实际上根本不需要使用document()函数

因为您在这里使用的是Microsoft.Net,所以应该能够访问XSLT的msxml扩展函数。事实上,msxml的相关名称空间已经在XSLT文档中定义

xmlns:msxsl="urn:schemas-microsoft-com:xslt"
这意味着您将能够使用node set函数轻松地直接访问State_Code_Tran变量中的节点。为此,请尝试将现有的xsl:choose函数更改为如下所示:

   <xsl:choose>
    <xsl:when test="msxsl:node-set($State_Code_Trn)/State[@In=$test_val]">
     <xsl:value-of select="msxsl:node-set($State_Code_Trn)/State[@In=$test_val]/@Out"/>
    </xsl:when>
    <xsl:otherwise>
     <xsl:text>Other</xsl:text>
    </xsl:otherwise>
   </xsl:choose>

其他
这将产生以下输出

<root>
<test_node>CA</test_node>
<test_node>CA</test_node>
<test_node>Other</test_node>
<test_node>TX</test_node>
<test_node>TX</test_node>
<test_node>Other</test_node>
<test_node>Other</test_node>
</root>

加利福尼亚州
加利福尼亚州
其他
德克萨斯州
德克萨斯州
其他
其他

(请注意,在原始XML中的一个“CA”之前有一个空格,这就是为什么它显示为“其他”。您可能需要添加一些修剪函数来处理此问题。

除了@Tim-C的答案外,您还可以使用ext:node-set()扩展函数,其中“ext”前缀与EXSLT命名空间关联:
"http://exslt.org/common“


这是由
xslcomiledtransform
支持的,它将使您的XSLT代码更易于移植,这是一个标准的扩展函数库。

hastoff@Tim,非常感谢:):))酷。我不知道XslCompiledTransform支持这一点。现在,如果它也支持XSLT2.0,那么我将是一个快乐的人……感谢您宝贵的回答:)
<root>
<test_node>CA</test_node>
<test_node>CA</test_node>
<test_node>Other</test_node>
<test_node>TX</test_node>
<test_node>TX</test_node>
<test_node>Other</test_node>
<test_node>Other</test_node>
</root>