0

次のxmlファイルがあります。

<xc:XmlCache xmlns:xc="XmlCache" xmlns:mp="mx.MarketParameters" xmlns:fx="mx.MarketParameters.Forex" xmlns:fxsp="mx.MarketParameters.Forex.Spot">
 <xc:XmlCacheArea xc:value="MarketParameters">
  <mp:nickName xc:value="MDS" xmlns:mp="mx.MarketParameters">
   <mp:date xc:value="20130315">
    <fx:forex xmlns:fx="mx.MarketParameters.Forex">
     <fxsp:spot xmlns:fxsp="mx.MarketParameters.Forex.Spot">
      <fxsp:pair xc:value="AUD/AED" xc:type="Fields">
       <mp:ask xc:keyFormat="N">1.0000000</mp:ask> 
       <mp:bid xc:keyFormat="N">1.0000000</mp:bid> 
       <mp:formFactor xc:keyFormat="N">1</mp:formFactor> 
       <mp:high xc:keyFormat="N">0.0000000</mp:high> 
       <mp:low xc:keyFormat="N">0.0000000</mp:low> 
       <mp:mid xc:keyFormat="N">1.0000000</mp:mid> 
       <mp:quotation xc:keyFormat="C">AUD-AED</mp:quotation> 
      </fxsp:pair>
      <fxsp:pair xc:value="BHD/AED" xc:type="Fields">
       <mp:ask xc:keyFormat="N">0.8264463</mp:ask> 
       <mp:bid xc:keyFormat="N">0.8264463</mp:bid> 
       <mp:formFactor xc:keyFormat="N">1</mp:formFactor> 
       <mp:high xc:keyFormat="N">0.0000000</mp:high> 
       <mp:low xc:keyFormat="N">0.0000000</mp:low> 
       <mp:mid xc:keyFormat="N">0.8264463</mp:mid> 
       <mp:quotation xc:keyFormat="C">BHD-AED</mp:quotation> 
      </fxsp:pair>
     </fxsp:spot>
    </fx:forex>
   </mp:date>
  </mp:nickName>
 </xc:XmlCacheArea>
</xc:XmlCache>

私は2つのことを行う方法を探しています.

期待される出力

<xc:XmlCache xmlns:xc="XmlCache" xmlns:mp="mx.MarketParameters" xmlns:fx="mx.MarketParameters.Forex" xmlns:fxsp="mx.MarketParameters.Forex.Spot">
<xc:XmlCacheArea xc:value="MarketParameters">
<mp:nickName xc:value="MDS" xmlns:mp="mx.MarketParameters">
<mp:date xc:value="20130315">
<fx:forex xmlns:fx="mx.MarketParameters.Forex">
<fxsp:spot xmlns:fxsp="mx.MarketParameters.Forex.Spot">
<fxsp:pair xc:value="AUD/AED" xc:type="Fields">
<mp:ask xc:keyFormat="N">1.0000000</mp:ask> 
<mp:bid xc:keyFormat="N">1.0000000</mp:bid> 
</fxsp:pair>
<fxsp:pair xc:value="BHD/AED" xc:type="Fields">
<mp:ask xc:keyFormat="N">0.8264463</mp:ask> 
<mp:bid xc:keyFormat="N">0.8264463</mp:bid> 
</fxsp:pair>
</fxsp:spot>
</fx:forex>
</mp:date>
</mp:nickName>
</xc:XmlCacheArea>
</xc:XmlCache>

出力 xml の値を csv ファイルで提供される値で更新するという考え方です (最初の値は入札、2 番目の値は売りです)。csv ファイルを xml に変換する必要がある場合は、問題ありません。

CSV file
AUD/AED;25;25
BHD/AED;20;20

ファイルは、私たちが使用するアプリケーションからのものです。値を変更したら、ファイルをアプリケーションに再インポートします。私は xsl で多くのことを試しましたが、それを機能させる方法がわかりません。

誰かが助けることができますか?

ありがとう

4

1 に答える 1

0

CSV ファイルを XML に変換することをお勧めします。XSLT は明らかに XML で最もよく機能します。また、XML 以外のファイルを解析するには、ほぼ確実に XSLT 2.0 を使用する必要があります。したがって、この回答の目的のために、ルックアップファイルが次のようになっていると想定しています

<csv>
   <record code="AUD/AED" bid="25" ask="25" />
   <record code="BHD/AED" bid="20" ask="20" />
</csv>

変換を行うという点では、XSLT ID 変換を基に構築して、既存のすべてのノードを最初にコピーする必要があります。

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

これは、変更したいノード/アトリビュート用に追加のテンプレートを作成するだけでよいことを意味します。

あなたは、'bid' と 'ask' 以外のすべての (葉の) 要素を削除したいと言っています。まあ、このようなテンプレートを記述して、他の要素をすべて無視することができます。

<xsl:template match="fxsp:pair/*[not(self::mp:ask) and not(self::mp:bid)]" />

他に必要なテンプレートは、除外されていない他の要素の下にあるテキスト ノードに一致するものだけです (つまり、これは 'ask' 要素と 'bid' 要素にのみ一致します)。

<xsl:template match="fxsp:pair/*/text()">

この中で、「ルックアップ」ファイルからルックアップを行うことができます

<xsl:value-of select="document('lookup.xml')//record[@code=$code]/@*[local-name()=$attr]"/>

この場合、$codeはfxsp:pairからのxc:valueの属性値に設定され、$ attrは現在の要素の名前 ('ask' または 'bid') です。

このXSLTを試してください

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xc="XmlCache" xmlns:mp="mx.MarketParameters" xmlns:fx="mx.MarketParameters.Forex" xmlns:fxsp="mx.MarketParameters.Forex.Spot">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="fxsp:pair/*[not(self::mp:ask) and not(self::mp:bid)]" />

  <xsl:template match="fxsp:pair/@xc:type" />

  <xsl:template match="fxsp:pair/*/text()">
    <xsl:variable name="code" select="../../@xc:value" />
    <xsl:variable name="attr" select="local-name(..)" />
    <xsl:value-of select="document('lookup.xml')//record[@code=$code]/@*[local-name()=$attr]"/>
  </xsl:template>
</xsl:stylesheet>

「ドキュメント」参照を変数に入れることができることに注意してください。これにより、物事が簡素化されます(実際、効率が向上します)。このXSLTも試してみてください

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xc="XmlCache" xmlns:mp="mx.MarketParameters" xmlns:fx="mx.MarketParameters.Forex" xmlns:fxsp="mx.MarketParameters.Forex.Spot">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:variable name="lookup" select="document('lookup.xml')//record" />

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

  <xsl:template match="fxsp:pair/*[not(self::mp:ask) and not(self::mp:bid)]" />

  <xsl:template match="fxsp:pair/@xc:type" />

  <xsl:template match="fxsp:pair/*/text()">
    <xsl:variable name="code" select="../../@xc:value" />
    <xsl:variable name="attr" select="local-name(..)" />
    <xsl:value-of select="$lookup[@code=$code]/@*[local-name()=$attr]"/>
  </xsl:template>
</xsl:stylesheet>
于 2013-09-27T17:24:09.920 に答える