.net 下的 XSLT 转换 - 从 XPath 传入的节点没有值
XSLT Transformation under .net - Passed in node from XPath has no value
全部,
我正在使用 .net 4.0 和旧的已弃用的 XslTransform() class 来执行从 xml 订单到 html 输出的转换。
我有一个 javascript 函数,该函数在带有以下 xpath 表达式的节点中传递:
<xsl:value-of select="user:renderNode(//items/item/Comments[string-length(text()) > 0])" disable-output-escaping="yes"/>
我已经使用 xpath 工具验证了 XPath 表达式 returns 我是一个包含文本内容的节点。不幸的是,在 javascript 函数本身,当我说
return node.CurrentPosition;
或
return node.Current.InnerXml;
位置为0,InnerXml returns整个订单而不是我的文本选择。
这是 C# 代码:
var t = new XslTransform();
t.Load("res/order.xsl");
t.Transform("res/order.xml", "res/output.htm");
string output;
using (var reader = File.OpenText("res/output.htm"))
{
output = reader.ReadToEnd();
}
和 XSLT:
<msxsl:script language="JScript" implements-prefix="user">
<![CDATA[
function renderNode(node) {
return node.Current.InnerXml;
}
]]>
</msxsl:script>
<tr>
<td colspan="6">
<xsl:value-of select="user:renderNode(//items/item/Comments[string-length(text()) > 0])" disable-output-escaping="yes"/>
</td>
</tr>
这是一个使用 XslTransform
和 .NET 运行的示例,XSLT 是
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:mf="http://example.com/mf" exclude-result-prefixes="msxsl mf"
>
<xsl:output method="xml" indent="yes"/>
<msxsl:script implements-prefix="mf" language="JScript">
function foo(nodeIterator) {
if (nodeIterator.MoveNext()) {
return nodeIterator.Current.Value;
}
else return '';
}
</msxsl:script>
<xsl:template match="/">
<xsl:value-of select="mf:foo(root/item)"/>
</xsl:template>
</xsl:stylesheet>
如您所见,在 XSLT 端,root/item
选择了一个节点集,并在 JScript 函数内部接收并处理了 XPathNodeIterator
。
输入 XML 为
<root>
<item>foo</item>
</root>
该示例输出字符串值 foo
.
的结果文档片段
全部,
我正在使用 .net 4.0 和旧的已弃用的 XslTransform() class 来执行从 xml 订单到 html 输出的转换。 我有一个 javascript 函数,该函数在带有以下 xpath 表达式的节点中传递:
<xsl:value-of select="user:renderNode(//items/item/Comments[string-length(text()) > 0])" disable-output-escaping="yes"/>
我已经使用 xpath 工具验证了 XPath 表达式 returns 我是一个包含文本内容的节点。不幸的是,在 javascript 函数本身,当我说
return node.CurrentPosition;
或
return node.Current.InnerXml;
位置为0,InnerXml returns整个订单而不是我的文本选择。
这是 C# 代码:
var t = new XslTransform();
t.Load("res/order.xsl");
t.Transform("res/order.xml", "res/output.htm");
string output;
using (var reader = File.OpenText("res/output.htm"))
{
output = reader.ReadToEnd();
}
和 XSLT:
<msxsl:script language="JScript" implements-prefix="user">
<![CDATA[
function renderNode(node) {
return node.Current.InnerXml;
}
]]>
</msxsl:script>
<tr>
<td colspan="6">
<xsl:value-of select="user:renderNode(//items/item/Comments[string-length(text()) > 0])" disable-output-escaping="yes"/>
</td>
</tr>
这是一个使用 XslTransform
和 .NET 运行的示例,XSLT 是
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:mf="http://example.com/mf" exclude-result-prefixes="msxsl mf"
>
<xsl:output method="xml" indent="yes"/>
<msxsl:script implements-prefix="mf" language="JScript">
function foo(nodeIterator) {
if (nodeIterator.MoveNext()) {
return nodeIterator.Current.Value;
}
else return '';
}
</msxsl:script>
<xsl:template match="/">
<xsl:value-of select="mf:foo(root/item)"/>
</xsl:template>
</xsl:stylesheet>
如您所见,在 XSLT 端,root/item
选择了一个节点集,并在 JScript 函数内部接收并处理了 XPathNodeIterator
。
输入 XML 为
<root>
<item>foo</item>
</root>
该示例输出字符串值 foo
.