1

XSLT変換を理解するのに苦労しています。現在、XML形式でシリアル化されたオブジェクトを受け取り、XSLTを適用して、新しいXMLをプログラムに送り返します。しかし今、私はXSLTステップを排除し、プログラムの内部で変換を行う必要があります。問題は、XSLTシートを2回目にしたことです。変換シートは本当にシンプルに見えますが、それでもそこで何が起こっているのかを理解することはできません。

<?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を使用せずにコレクション間でオブジェクトを移動します(これが行われている場合)。誰かがこれについて私を助けてもらえますか?

4

3 に答える 3

2

多くの理由から、XSLT変換をC#に「変換」することはお勧めしません

2つの言語間の非互換性のため、これは必ずしも簡単ではありません。

  1. テンプレートをシミュレートし、C#でパターンを一致させる方法を考えますか?

  2. XSLT処理モデルをシミュレートする方法は?

  3. スタイルシートモジュールのインポートをシミュレートし、インポートの優先順位が最も高いオブジェクトを特定するにはどうすればよいですか?

  4. キーをシミュレートする方法は?

  5. translate()C#でnormalize-space()、いくつかの便利なXPath(およびXSLT)標準関数(、、、、、、などsubstring-before()のすべての文字列関数)を実装する必要がありますsubstring-after()

  6. などの命令となどの<xsl:number>機能format-number()

したがって、これらすべてに投資するために必要な時間があり、結果が成功する場合(これはあまりありそうにありません)、翻訳は元の翻訳よりも数倍長くなり、ほとんどの場合、完全に理解できず、拡張できません、メンテナンスできません。

また、翻訳が元の翻訳よりも大幅に高速に実行されるかどうかも疑問です。場合によっては、実行速度が遅くなる可能性があります(たとえば、キーを効率的に実装していない場合)。

結論:私はそのような破壊的な活動に従事することを強くお勧めします。

于 2012-09-20T12:32:14.330 に答える
1

クラスを使用して、C#プログラム内でXSTL変換を実行できますXslCompiledTransform(参照:http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx)。

于 2012-09-20T08:52:06.903 に答える
0

XslTo.NETコードジェネレーターを使用してみてください; これはMicrosoftVisualStudio 2010のアドインであり、テンプレートC#からコードを生成するのに役立ちます。XSL

于 2012-09-20T09:11:16.070 に答える