我正在努力理解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的情况下在集合之间移动对象(如果这是正在发生的事情)。有人可以帮我吗?
答案 0 :(得分:2)
由于种种原因,我不建议将XSLT转换“转换”为C#:
由于两种语言之间不兼容,这并不总是很容易:
想一想如何在C#中模拟模板和匹配模式?
如何模拟XSLT处理模型?
如何模拟导入样式表模块并确定哪些是具有最高导入优先级的对象?
如何模拟按键?
您必须在C#中实现许多有用的XPath(和XSLT)标准函数 - 所有字符串函数,例如translate()
,normalize-space()
,substring-before()
,substring-after()
,...等
<xsl:number>
等说明以及format-number()
等功能。
所以,如果你有时间投入所有这些并且结果是成功的(这不太可能),翻译将比原版翻译几倍,在大多数情况下 - 完全不可理解,不可扩展,不可维护。
我也怀疑翻译的速度会比原版快得多 - 在某些情况下它可能会运行得更慢(例如,没有有效地实现密钥)。
结论:我强烈建议不要参加这种破坏性活动。
答案 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
代码。