2011-06-30 26 views
0

XML翻訳に関する質問があります。私は別のXMLに変換するXMLを持っています。 私のxlsはかなり簡単です。私が望むフィールドを取るだけです。私が気づいているのは、例えば、私が1,2,3,4を持っていて、私のxslに私はただ私が1,3を望むと決めたら、2も同様に来るということです。私はxslについてデフォルトルールなどを読むことを信じています:...XSLでXMLタグを無視する

私は望んでいないものでも、各タグのルールを作成する必要はありますか? 私は欲しくないものをどうすれば処理できますか? (私はいくつかのことを試みましたが、まだそれを出力します)。 まっすぐなXML 2 XML翻訳にはチュートリアルや良いページはありますか?

すべての洞察力は素晴らしいです、私はグーグルにもっと離れています。

ありがとうございました。

それが現在にマッチフィルターなしで立っているように、これは私のXSLです:

<?xml version="1.0" encoding="windows-1252"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes" method="xml" /> 

    <!--FileImport--> 

    <xsl:template match="FileImport"> 
     <FileImport> 
      <xsl:apply-templates /> 
     </FileImport> 
    </xsl:template> 

    <!--Start--> 
    <xsl:template match="Start"> 
     <Start> 
      <xsl:apply-templates /> 
     </Start> 
    </xsl:template> 

    <xsl:template match="StartParam"> 
     <StartParam> 
      <xsl:attribute name="name"> 
       <xsl:value-of select="@name" /> 
      </xsl:attribute> 
      <xsl:attribute name="value"> 
       <xsl:value-of select="@value" /> 
      </xsl:attribute> 
     </StartParam> 
    </xsl:template> 


    <!-- CLip --> 
    <xsl:variable name="fields" select="'|clip|number|technical_comments|channel|'" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Clip"> 
     <xsl:copy> 
      <xsl:apply-templates select= 
       "*[contains($fields, concat('|', @name, '|'))]" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

そして、私のXMLのビットが

<?xml version="1.0" encoding="windows-1252" ?> 
<?xml-stylesheet type="text/xsl" href="test.xsl"?> 

<FileImport> 
    <Global> 
     <GlobalParam name="RollName" value="Scene1" /> 
     <GlobalParam name="TapeOrg" value="10:00:00:00" /> 
     <GlobalParam name="ReadStart" value="00:00:00:00" /> 
     <GlobalParam name="ReadDuration" value="00:02:26:18" /> 
    </Global> 
    <Roll> 
     <Field name="ingest_report" value="&lt;?xml version=&quot;1.0&quot; standalone=&quot;yes&quot;?&gt;&#xD;&#xA;&lt;DataSet1 
     </Roll> 
     <Clip> 
      <Field name="audio_format" value="" group="Ingest" /> 
      <Field name="camera_id" value="" group="Ingest" /> 
     </Clip> 

    </FileImport> 

で、うまくいけば、私の出力は

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="testFIDEF.xsl"?> 

<FileImport> 
    <Global> 
     <GlobalParam name="RollName" value="Scene_Around_Six_Tape_3_BUFVC003-14 10:00:00:00" /> 
     <GlobalParam name="TapeOrg" value="10:00:00:00" /> 
     <GlobalParam name="ReadStart" value="00:00:00:00" /> 
     <GlobalParam name="ReadDuration" value="00:02:26:18" /> 
    </Global> 

    <MasterClip> 
     <Field name="clip_description" value="Interview Captain Austin Ardill re Terence O'Neill" group="Ingest" /> 
     <Field name="rushes_roll_number" value="BUFVC003" group="Ingest" /> 
     <Field name="source_image_format" value="" group="Ingest" /> 
     <Field name="technical_comments" value="" group="Ingest" /> 
    </MasterClip> 
</FileImport> 
のようになります。
+2

あなたが間違っている箇所を確認できるように、コードを投稿しておけば本当に便利です。 –

+0

これは実際にトランスフォームのデザインに依存します。 –

+0

あなたはそれがまだ十分ではないと思っていると思います。たとえば、 ' 'という命令では、現在のコンテキストのすべての子にテンプレートを適用します。明示的にそれらの子供を管理していない場合、組み込みのルールはバックグラウンドで動作し、したがっていくつかの驚きを行います。 XML入力と必要な出力を表示する必要があります。 –

答えて

2

デフォルトでは、別のテンプレートrulと一致しない場合は、テキストノードの値が変換されますe。これを避けるには、テンプレートを追加します。

<xsl:template match="text()|@*" /> 

これは、テキストと属性のデフォルトルールよりも優先されます。これは、xsl:value-ofを使用して出力するテキストの値を明示的に選択する必要があることを意味します。あなたのコメントを1として

+0

そして、どこにxsl?を置きますか?私はそれが最初であると仮定しましたが、それでも動作しません! – user685590

+0

後でルールに影響しないように、最初に配置することをお勧めします。ノードが別のルールと一致している場合、そのノードはまだ値出力を持つことができます。問題を再現する質問にいくつかのコードを含めることができますか? – detaylor

+0

XSLコードで更新されました。見ていただきありがとうございます。 – user685590

1

検索作品、それが唯一の私が指定したが、明らかに私は出力と一緒に来て<roll>したくない返します。この部分で

ルックトランスフォーム:

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

このようなテンプレートが恒等変換として知られています。そのタスクは入力内のすべてを出力にコピーすることであるため、変換で使用するときはは不要な要素を明示的にシャットダウンする必要があります()。あなたが身元をオーバーライドして、変換がその要素のために何もしない作る、ある

<xsl:template match="roll"/> 

:あなたはrollをしたくない場合は、コメントごとに、次のようなテンプレートが必要です。

関連する問題