2017-02-08 3 views
1

XMLファイルをCSVファイルに変換しようとしていますが、ある時点で突っ込まれています。XSLでXMLをCSVに変換する - foreach内のタグの値を取得する方法

これは私のXMLのサンプルバージョン

<xc:XmlCache xc:action="Update" xmlns:mp="mx.MarketParameters" xmlns:xc="XmlCache" xmlns:sc="mx.MarketParameters.Securities" xmlns:scpr="mx.MarketParameters.Securities.Prices"> 
    <xc:XmlCacheArea xc:value="MarketParameters"> 
     <mp:nickName xc:value="GLBORF" xc:subset="Reference"> 
      <mp:date xc:value="TODAY"> 
       <sc:security> 
        <scpr:price> 
         <scpr:type xc:value="Index"> 
          <scpr:market xc:value="FB"> 
           <scpr:label xc:value="SEB IMMOINVEST"> 
            <scpr:maturity xc:value="SPOT" xc:type="Fields"> 
             <mp:lst xc:type="Field" xc:keyFormat="N">23.14</mp:lst> 
             <mp:quotation xc:type="Field">PRICE</mp:quotation> 
             <mp:ask1 xc:type="Field" xc:keyFormat="N">23.14</mp:ask1> 
             <mp:max xc:type="Field" xc:keyFormat="N">23.14</mp:max> 
             <mp:clo xc:type="Field" xc:keyFormat="N">23.14</mp:clo> 
             <mp:min xc:type="Field" xc:keyFormat="N">23.14</mp:min> 
             <mp:bid1 xc:type="Field" xc:keyFormat="N">23.14</mp:bid1> 
            </scpr:maturity> 
           </scpr:label> 
          </scpr:market> 
         </scpr:type> 
        </scpr:price> 
       </sc:security> 
      </mp:date> 
     </mp:nickName> 
    </xc:XmlCacheArea> 
</xc:XmlCache> 

これは私のXSLです:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://www.w3.org/1999/XSL/Format "> 
    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/> 
    <xsl:template match="/"> 
     XmlCacheArea,nickName,date,type,market,label,maturity, lst,quotation,ask1, max,clo,min,bid1 
     <xsl:for-each select="//XmlCacheArea"> 
      <xsl:for-each select="//nickName"> 
       <xsl:for-each select="//date"> 
        <xsl:for-each select="//type"> 
         <xsl:for-each select="//market"> 
          <xsl:for-each select="//label"> 
           <xsl:for-each select="//maturity"> 
            <xsl:value-of select="concat(XmlCacheArea,',',nickName,',',date,',',type,',',market,',',label,',',maturity,',', lst,',',quotation,',',ask1,',', max,',',clo,',',min,',',bid1,'&#xA;')"/> 
           </xsl:for-each> 
          </xsl:for-each> 
         </xsl:for-each> 
        </xsl:for-each> 
       </xsl:for-each> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

これは私が取得しています出力されます:

XmlCacheArea nickName date type market label maturity  lst quotation ask1  max clo min bid1 
           23.14 PRICE 23.14 23.14 23.14 23.14 23.14 

そして、これは私が欲しいものですO得る:

XmlCacheArea nickName date type market label maturity  lst quotation ask1  max clo min bid1 
    MarketParameters GLBORF TODAY Index FB SEB IMMOINVEST SPOT 23.14 PRICE 23.14 23.14 23.14 23.14 23.14 

私は、foreachループ内のタグから値を盗んすることができません。

誰かお手伝いできますか?

種類よろしく

答えて

0
  • ネストされたxsl:for-eachは必要ありません。
  • //xxsl:for-eachは、ドキュメントノードからの子孫全体のx要素を選択するので適切ではありません。
  • 要素の指定にはnamespaceを使用する必要があります。ここで

私の例である:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:sc="mx.MarketParameters.Securities" 
    xmlns:xc="XmlCache" 
    xmlns:mp="mx.MarketParameters" 
    xmlns:scpr="mx.MarketParameters.Securities.Prices"> 

    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/> 

    <xsl:template match="/"> 
     <xsl:text>XmlCacheArea,nickName,date,type,market,label,maturity, lst,quotation,ask1, max,clo,min,bid1&#xA;</xsl:text> 
     <xsl:for-each select="//xc:XmlCacheArea/mp:nickName/mp:date/sc:security/scpr:price/scpr:type/scpr:market/scpr:label/scpr:maturity"> 
      <xsl:value-of select="concat(ancestor::xc:XmlCacheArea/@xc:value,',',ancestor::mp:nickName/@xc:value,',',ancestor::mp:date/@xc:value,',',ancestor::scpr:type/@xc:value,',',ancestor::scpr:market/@xc:value,',',ancestor::scpr:label/@xc:value,',',@xc:value,',', mp:lst,',',mp:quotation,',',mp:ask1,',', mp:max,',',mp:clo,',',mp:min,',',mp:bid1,'&#xA;')"/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

そして結果:

Result CSV opend via Excel

+0

感謝!私はそれを祖先の代わりに../../などを使ってやっていました。 あなたのソリューションは明らかに私を改善します – SCouto

関連する問題