【问题标题】:Working with XML & XSL使用 XML 和 XSL
【发布时间】:2010-03-08 10:30:51
【问题描述】:

首次编辑
我正在以 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);

【问题讨论】:

  • 您在使用 .Net 吗?如果是的话,我可以帮助你..当然..
  • 是的....我正在使用 VS 2008 Express 版本,我打算为此使用 C# 和 xml。

标签: c# xml xslt xls


【解决方案1】:

首先,确保 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>

【讨论】:

  • 很好地解释了 Muenchian 分组,但是为什么在提取给定日期的新闻站点时不使用密钥,即用 key('dates', $date) 替换 /data/newsitem[@date=$date]?此外,使用count(.|key('dates', $date)[1]) = 1 而不是generate-id() = generate-id(key('dates', @date)[1]) 可能会产生更好的性能,如tkachenko.com/blog/archives/000401.html 所述。最后,只有 XSLT 1.0 才需要 Muenchian 分组。对于 XSLT 2.0,请改用 xsl:for-each-group
  • 在我之前的评论中,应该是count(.|key('dates', @date)[1]) = 1,而不是count(.|key('dates', $date)[1]) = 1
  • 没想到你可以对key()的结果进行排序,但你当然可以。
【解决方案2】:

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

【讨论】:

  • 这正是 XSLT 的设计目的。
  • 我不同意。 XSLT 用于将 XML 从一种形式转换为另一种形式,但如果您的样式表开始包含太多逻辑,我认为它可能放错了位置。 XSLT 当然可以做到;我只是不认为它总是最适合它的地方。而且我当然不希望客户做很多工作。
  • 你认为构建一个密钥并使用它太逻辑了?
  • 不确定“构建密钥”是什么意思,但如果您说 XML 的源代码应该构建在允许 XSTL 使用简单 呈现的元素中,那么我'米赞成。我只是反对将 XSTL 变成脚本语言。
【解决方案3】:

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

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

并在运行转换之前通过创建 XsltArgumentList setting the parameter to a value and format you want/need 进行设置,然后将该 XsltArgumentList 作为第二个参数传递给 Transform 方法。然后在您的样式表中,您可以将 XML 输入元素或属性中的日期与参数进行比较。

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 对不起.... 我使用 Windows 窗体 (C#) 和 xml 将输出呈现给用户。请帮忙????
    • 我不熟悉这个。有关使用 XSLT 解决问题的提示,请查看 jenitennison.com/xslt/grouping/index.xml
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2011-02-14
    • 1970-01-01
    • 2023-04-06
    • 2011-04-05
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多