将XSLT转换转换为C#

时间:2012-09-20 08:14:13

标签: c# xslt xml-serialization

我正在努力理解XSLT转换。目前,我收到XML格式的序列化对象,然后应用XSLT并将新XML发送回程序。但是现在我需要消除XSLT步骤并在程序内部进行转换。问题是我第二次看到XSLT表。转换表看起来很简单,但我仍然无法了解那里发生的事情。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:t="http://tempuri.org/">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template name="CopyEverything" match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="/t:Data/Flagged">
    <xsl:element name="Flagged">
      <xsl:apply-templates select="/t:Data/Covers/node()|@*"/>
    </xsl:element>
  </xsl:template>
  <xsl:template match="/t:Data/FlaggedDetails">
    <xsl:element name="FlaggedDetails">
      <xsl:apply-templates select="/t:Data/TotalFlaggedDetails/node()|@*"/>
    </xsl:element>
  </xsl:template>
  <xsl:template match="/t:Data/System/RArray">
    <xsl:element name="{local-name()}">
      <xsl:for-each select="/t:Data/System/RArray/Elem">
        <xsl:call-template name="CopyEverything"/>
      </xsl:for-each>
      <xsl:for-each select="/t:Data/Elem/Elem">
        <xsl:variable name="currentCode" select="Code" />
        <xsl:variable name="showAlways" select="ShowAlways" />
        <xsl:if test="count(/t:Data/System/RArray/Elem[Code=$currentCode])=0">
          <xsl:call-template name="CopyEverything"/>
        </xsl:if>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

据我所知,Data / Flagged和Data / FlaggedDetails中的某些内容被复制到Data / System / RArray,我无法将此逻辑转换为C#。我必须消除序列化步骤,所以我在没有XSLT的情况下在集合之间移动对象(如果这是正在发生的事情)。有人可以帮我吗?

3 个答案:

答案 0 :(得分:2)

由于种种原因,我不建议将XSLT转换“转换”为C#

由于两种语言之间不兼容,这并不总是很容易:

  1. 想一想如何在C#中模拟模板和匹配模式?

  2. 如何模拟XSLT处理模型?

  3. 如何模拟导入样式表模块并确定哪些是具有最高导入优先级的对象?

  4. 如何模拟按键?

  5. 您必须在C#中实现许多有用的XPath(和XSLT)标准函数 - 所有字符串函数,例如translate()normalize-space()substring-before()substring-after(),...等

  6. <xsl:number>等说明以及format-number()等功能。

  7. 所以,如果你有时间投入所有这些并且结果是成功的(这不太可能),翻译将比原版翻译几倍,在大多数情况下 - 完全不可理解,不可扩展,不可维护。

    我也怀疑翻译的速度会比原版快得多 - 在某些情况下它可能会运行得更慢(例如,没有有效地实现密钥)。

    结论:我强烈建议不要参加这种破坏性活动。

答案 1 :(得分:1)

您可以使用XslCompiledTransform类(参考:http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx)在C#程序中进行XSTL转换。

答案 2 :(得分:0)

尝试使用 Xsl To .NET Code Generator ;它是 Microsoft Visual Studio 2010 的加载项,它可以帮助您从C#模板生成XSL代码。