C# 使用XML&;XSL
第一次编辑C# 使用XML&;XSL,c#,xml,xslt,xls,C#,Xml,Xslt,Xls,第一次编辑 我正在以C#形式将Child 1标记提取到DropDownList中,请建议删除XML文件中父标记及其所有子标记的最佳实践代码(C#)。 例如: 这是生成XML的后端应该处理的事情。XSLT不是很多逻辑的最佳场所。最好在查询新闻条目后将所有这些信息嵌入到XML中。只需将它们以适当的形式发送到客户机,这样它们就不必如此辛苦地工作。如果使用PHP中的XSLT处理器,则可以在XSLT脚本中使用PHP函数。您所需要的只是在转换之前调用RegisterHPFunctions。正确顺序的结果值可
我正在以C#形式将Child 1标记提取到DropDownList中,请建议删除XML文件中父标记及其所有子标记的最佳实践代码(C#)。 例如:
这是生成XML的后端应该处理的事情。XSLT不是很多逻辑的最佳场所。最好在查询新闻条目后将所有这些信息嵌入到XML中。只需将它们以适当的形式发送到客户机,这样它们就不必如此辛苦地工作。如果使用PHP中的XSLT处理器,则可以在XSLT脚本中使用PHP函数。您所需要的只是在转换之前调用RegisterHPFunctions。正确顺序的结果值可用于排序。XSLT样式表允许在运行转换之前设置全局参数。因此,如果需要样式表中的当前日期,可以使用XSLT1.0和.NET的XslCompiledTransform定义一个全局参数
<xsl:param name="current-date"/>
并在运行转换之前通过创建XsltArgumentList设置该参数,然后将该XsltArgumentList作为第二个参数传递给转换方法。然后在样式表中,可以将XML输入元素或属性中的日期与参数进行比较
当您使用.NET时,另一个选择是使用XSLT2.0;微软不支持,但有第三方解决方案。XSLT/XPath 2.0有一个名为的函数,这样您就不需要参数。首先,确保XML中的日期以规范的YYYY-MM-DD格式表示,时间为HH:MM:SS,以便XSLT(在1.0中,没有日期或时间数据类型)可以对其进行比较和排序 其次,使用Steve Muench的分组技术。您可以使用
xsl:key
在项目的日期上生成一个键。然后可以使用key()
函数查找给定日期所有项目的列表
使用该键,您可以构建项目中显示的不同日期的列表。这是Muenchian技巧:查找key()为该项的日期返回的列表中的第一项。这项技术保证,对于每个不同的日期值,您总是得到一个且只有一个项目。然后对这些项目进行排序,并使用它们的日期来驱动输出的实际生产
一个简单的例子:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="dates" match="/data/newsitem" use="@date"/>
<xsl:template match="/">
<output>
<!-- find exactly one newsitem node for each distinct @date in the document -->
<xsl:for-each select="/data/newsitem[generate-id() = generate-id(key('dates', @date)[1])]">
<xsl:sort select="@date" order="descending"/>
<xsl:call-template name="newsitems_for_date">
<xsl:with-param name="date" select="@date"/>
</xsl:call-template>
</xsl:for-each>
</output>
</xsl:template>
<xsl:template name="newsitems_for_date">
<xsl:param name="date"/>
<h1>
<xsl:value-of select="$date"/>
</h1>
<xsl:apply-templates select="/data/newsitem[@date=$date]">
<xsl:sort select="@time" order="descending"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="newsitem">
<p>
newsitem for <xsl:value-of select="@date"/>
</p>
</xsl:template>
</xsl:stylesheet>
新闻项目
对不起。。。。我使用Windows窗体(C#)和xml向用户显示输出。有什么帮助吗???我不熟悉这个。有关解决XSLT问题的提示,请查看您是否在使用.Net?如果是的话,我可以帮你。。当然……是的。。。。我正在使用VS2008ExpressEdition,我计划为此使用C#和xml。这正是XSLT设计的目的。我不同意。XSLT用于将XML从一种形式转换为另一种形式,但如果样式表中的逻辑太多,我认为它可能放错了位置。XSLT当然可以做到这一点;我只是不认为它总是最好的地方。我当然不想让客户端做太多的工作。你认为构建一个键并使用它是太多的逻辑吗?不确定“构建一个键”是什么意思,但是如果你说XML的源应该构建在一个元素中,允许XSTL以简单的方式呈现,那么我赞成。我只是反对将XSTL转换为脚本语言。这对明钦语分组有很好的解释,但为什么不在提取给定日期的新闻项时使用该键,即用键('dates',$date)
替换/data/newsitem[@date=$date]
?此外,使用count(.| key('dates',$date)[1])=1
而不是generate-id()=generate-id(key('dates',@date)[1])
可能会产生更好的性能,如上所述。最后,只有XSLT1.0才需要Muenchian分组。在XSLT2.0中,对每个组使用xsl:foreach
。在我之前的评论中,它应该是count(.| key('dates',@date)[1])=1
,而不是count(.| key('dates',$date)[1])=1
。我没有想到你可以对key()
的结果进行排序,但你当然可以。
new XDocument(
new XElement("issues",
new XElement("issue",
new XElement("cat", comboBox1.Text),
new XElement("desc", richTextBox1.Text),
new XElement("end", dateTimePicker1.Text),
new XElement("att", textBox2.Text)
)
)
).Save(path);
<xsl:param name="current-date"/>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="dates" match="/data/newsitem" use="@date"/>
<xsl:template match="/">
<output>
<!-- find exactly one newsitem node for each distinct @date in the document -->
<xsl:for-each select="/data/newsitem[generate-id() = generate-id(key('dates', @date)[1])]">
<xsl:sort select="@date" order="descending"/>
<xsl:call-template name="newsitems_for_date">
<xsl:with-param name="date" select="@date"/>
</xsl:call-template>
</xsl:for-each>
</output>
</xsl:template>
<xsl:template name="newsitems_for_date">
<xsl:param name="date"/>
<h1>
<xsl:value-of select="$date"/>
</h1>
<xsl:apply-templates select="/data/newsitem[@date=$date]">
<xsl:sort select="@time" order="descending"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="newsitem">
<p>
newsitem for <xsl:value-of select="@date"/>
</p>
</xsl:template>
</xsl:stylesheet>