Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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
C# 使用XML&;XSL_C#_Xml_Xslt_Xls - Fatal编程技术网

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>