3

第一次编辑
我以 C# 形式将Child 1标签提取到 DropDownList 中,请建议最佳实践代码 (C#) 用于删除父标签和 XML 文件中的所有子标签。例子:

    <Parents>
      <Parent>
        <Child 1>Something</Child 1>
        <Child 2>Something</Child 2>
        <Child 3>Something</Child 3>
        <Child 4>Something</Child 4>
      </Parent>
      <Parent>
        <Child 1>Something 1</Child 1>
        <Child 2>Something 1</Child 2>
        <Child 3>Something 1</Child 3>
        <Child 4>Something 1</Child 4>
      </Parent>
    </Parents>

---上一个问题---
如何将以下样式表标签插入到使用 C# 代码创建的新 xml 文件中????

<?xml-stylesheet type="text/xsl" href="issuez.xsl"?>

创建 xml 文件的 C# 代码:-

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);
4

4 回答 4

4

首先,确保 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>
于 2010-03-09T16:39:57.233 回答
2

这是生成 XML 的后端应该处理的事情。XSLT 不是处理大量逻辑的最佳场所。最好在查询新闻项目后将所有内容嵌入到 XML 中。只需以适当的形式将它们发送给客户,这样他们就不必那么辛苦了。

于 2010-03-08T10:55:39.337 回答
1

XSLT 样式表允许在运行转换之前设置全局参数。因此,使用 XSLT 1.0 和 .NET 的 XslCompiledTransform 如果您需要样式表中的当前日期,您可以定义一个全局参数

  <xsl:param name="current-date"/>

并在运行转换之前通过创建 XsltArgumentList 进行设置,将参数设置为您想要/需要的值和格式,然后将该 XsltArgumentList 作为第二个参数传递给 Transform 方法。然后在您的样式表中,您可以将 XML 输入元素或属性中的日期与参数进行比较。

当您使用 .NET 时,另一个选择是使用 XSLT 2.0;Microsoft 不支持,但Saxon 9有第三方解决方案。XSLT/XPath 2.0 有一个名为current-date的函数,这样您就不需要参数了。

于 2010-03-08T12:54:32.607 回答
0

如果您使用 PHP 中的 XSLT 处理器,则可以在 XSLT 脚本中使用 PHP 函数。您只需要在转换之前调用 registerPhpFunctions 即可。正确顺序的结果值可用于排序。

于 2010-03-08T12:08:21.000 回答