C# 通过C使用XSLT将XML转换为XML#
我有一个XML文件(书),在创建输出XML文件之前需要对其进行更改 我有一个XSLT转换文件,它可以很好地完成部分工作,但我还需要更进一步,这是我正在努力的地方 在C#中,我使用XslCompiledTransform对象来触发转换任务,但这不起作用,因为XML文件输出为空 代码隐藏C# 通过C使用XSLT将XML转换为XML#,c#,xml,xslt,C#,Xml,Xslt,我有一个XML文件(书),在创建输出XML文件之前需要对其进行更改 我有一个XSLT转换文件,它可以很好地完成部分工作,但我还需要更进一步,这是我正在努力的地方 在C#中,我使用XslCompiledTransform对象来触发转换任务,但这不起作用,因为XML文件输出为空 代码隐藏 XslCompiledTransform transform = new XslCompiledTransform(); transform.Load(Server.MapPath("~/RSS91.xslt"))
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(Server.MapPath("~/RSS91.xslt"));
transform.Transform(Server.MapPath("~/book.xml"), Server.MapPath("~/output.xml"));
RSS91.xslt
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:param name="title"/>
<xsl:template match="rss">
<xsl:for-each select="channel/item">
<br>
<strong>
<a href="{link}" target="_main">
<xsl:value-of select="title"/>
</a>
</strong>
<br></br>
<xsl:value-of select="description" disable-output-escaping="yes"/>
</br>
<br></br>
<xsl:value-of select="pubDate"/>
<br></br>
</xsl:for-each>
</xsl:template>
<xsl:template match="description">
<br>
<xsl:value-of select="."/>
</br>
</xsl:template>
</xsl:stylesheet>
book.xml
<?xml version="1.0" encoding="utf-8" ?>
<rss>
<title></title>
</rss>
正如@HenkHoltermann所建议的那样,如果输入XML和应用的XSLT样式表是空的,那么输出XML文档是空的 XSLT样式表工作得很好——只是转换了与之无关的输入XML。让我解释一下原因 在样式表中,有两个模板与
元素rss
元素说明
<?xml version="1.0" encoding="utf-8" ?>
<rss>
<title></title>
</rss>
它什么也不做,因为在输入XML中,它里面既没有频道
,也没有项
元素。因此,会触发第一个模板,但不会整体输出任何内容
第二个模板根本不会被触发,输入XML中没有description
元素
总之,XSLT样式表通常是针对特定类型的输入XML文档定制的。它要么依赖于输入XML中存在的特定结构,要么依赖于存在的特定值或其他内容。一个例外是身份转换,它可以应用于任何形式良好的XML
对不起,我还没弄明白我需要做什么 嗯,我有两条建议
- 这准确地描述了您正在做的事情: 想象一下你拥有一头牛。如果你完全简化了这个过程,奶牛就会把草变成牛奶。这很简单——你输入草,奶牛输出牛奶。这种方法之所以有效,是因为奶牛的消化系统“知道”如何把草变成牛奶。但它只准备咀嚼草。现在,你正在喂你的奶牛石头和旧轮胎。你为什么期望它快乐地生产牛奶
- 自己学习XSLT。阅读一本书,学习例子,完成一个教程
转换是匹配的,然后选择每个通道/项目标记。没有,所以很明显输出中没有创建XML。很抱歉,我还没有弄清楚我需要做什么
<xsl:for-each select="channel/item">