gpt4 book ai didi

c# - 在 XSLT 扩展方法的返回值上使用 Xpath

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:48 25 4
gpt4 key购买 nike

我有一个扩展方法返回的 xml。有人可以帮我使用吗<xsl:for-each>在这个 xml 上。

public class CustomObj
{
//function that gets called from XSLT
public XPathNodeIterator GetResultTable()
{
DataTable table = new DataTable("Table1");

table.Columns.Add("SourceCity");
table.Columns.Add("DestinationCity");
table.Columns.Add("Fare");

table.Rows.Add(new object[] { "New York", "Las Vegas", "100" });
table.Rows.Add(new object[] { "New York", "London", "200" });
table.Rows.Add(new object[] { "New York", "New Delhi", "250" });

StringWriter writer = new StringWriter();
table.WriteXml(writer);

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("Root");
root.InnerXml = writer.ToString();
doc.AppendChild(root);

return doc.CreateNavigator().Select("root");
}
}

我想遍历这个 xml。有人请帮忙。我是 XSLT 的新手,如果您能提供有关给定 xml 本身的示例,我将不胜感激。

最佳答案

有两点需要注意:

  1. 将转换应用于调用方法 GetResultTable() 的结果比通过扩展函数获取结果要自然得多。

  2. 如所写,GetResultTable() 方法根本不返回任何节点:在语句中

--

   return doc.CreateNavigator().Select("root");

Select() 方法不会选择任何内容,因为 doc 中没有 root 元素。未选择名为 Root 的元素,因为 XML 和 XPath 区分大小写。

另一个观察结果是根本没有必要在 XSLT 转换中使用 xsl:for-each -- 在大多数情况下,这被认为不是一个好的做法例。

话虽如此,这里是这个问题要求的完整代码:

namespace TestXml
{
using System;
using System.Data;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;

class Program
{
static void Main(string[] args)
{
CustomObj co = new CustomObj();
XPathNodeIterator xpni = co.GetResultTable();

XslCompiledTransform xslt = new XslCompiledTransform(true);
xslt.Load(@"..\..\My.xslt");

XsltArgumentList xargs = new XsltArgumentList();
xargs.AddExtensionObject("my:extension", co);

XmlDocument fakeDoc = new XmlDocument();
fakeDoc.LoadXml("<t/>");

StringWriter sw = new StringWriter();

xslt.Transform(fakeDoc.CreateNavigator(), xargs, sw);

string result = sw.ToString();

Console.Write(result);
}
}

public class CustomObj
{ //function that gets called from XSLT
public XPathNodeIterator GetResultTable()
{
DataTable table = new DataTable("Table1");
table.Columns.Add("SourceCity");
table.Columns.Add("DestinationCity");
table.Columns.Add("Fare");
table.Rows.Add(new object[] { "New York", "Las Vegas", "100" });
table.Rows.Add(new object[] { "New York", "London", "200" });
table.Rows.Add(new object[] { "New York", "New Delhi", "250" });
StringWriter writer = new StringWriter();
table.WriteXml(writer);
XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("Root");
root.InnerXml = writer.ToString();
doc.AppendChild(root);
return doc.CreateNavigator().Select("Root");
}
}
}

和文件 My.xslt:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:extension"
exclude-result-prefixes="my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/">
<html>
<table border="1">
<tr>
<td>Source</td>
<td>Destination</td>
<td>Fare</td>
</tr>
<xsl:apply-templates select="my:GetResultTable()/*/Table1"/>
</table>
</html>
</xsl:template>

<xsl:template match="Table1">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>

<xsl:template match="Table1/*">
<td>
<xsl:apply-templates/>
</td>
</xsl:template>
</xsl:stylesheet>

执行应用程序时,会产生所需的正确结果:

<html>
<table border="1">
<tr>
<td>Source</td>
<td>Destination</td>
<td>Fare</td>
</tr>
<tr>
<td>New York</td>
<td>Las Vegas</td>
<td>100</td>
</tr>
<tr>
<td>New York</td>
<td>London</td>
<td>200</td>
</tr>
<tr>
<td>New York</td>
<td>New Delhi</td>
<td>250</td>
</tr>
</table>
</html>

关于c# - 在 XSLT 扩展方法的返回值上使用 Xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6643009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com