2017-02-08 14 views
0

XMLとXSLTの新機能です。私は数時間の間Googleを検索しましたが、まだこれを把握していません....名前がコロンであるノードをCSVに解析するXSLT

私が解析しようとしているXMLコードのスニペットです。

<?xml version="1.0"?> 
<gam:gameboxscore xmlns:gam="http://leaguemanager.beacontender.com/plugin/feed/sport/usftbl/gameboxscore"> 
    <gam:lastUpdatedOn>2017-01-08 12:22:22 AM</gam:lastUpdatedOn> 
    <gam:game> 
     <gam:date>2017-01-07</gam:date> 
     <gam:time>8:15PM</gam:time> 
     <gam:awayTeam> 
      <gam:ID>61</gam:ID> 
      <gam:City>Detroit</gam:City> 
      <gam:Name>Lions</gam:Name> 
      <gam:Abbreviation>DET</gam:Abbreviation> 
     </gam:awayTeam> 
     <gam:homeTeam> 
      <gam:ID>79</gam:ID> 
      <gam:City>Seattle</gam:City> 
      <gam:Name>Seahawks</gam:Name> 
      <gam:Abbreviation>SEA</gam:Abbreviation> 
     </gam:homeTeam> 
     <gam:location>CenturyLink Field</gam:location> 
    </gam:game> 
    <gam:quarterSummary> 
     <gam:quarter number="1"> 
     <gam:awayScore>0</gam:awayScore> 
     <gam:homeScore>0</gam:homeScore> 
     <gam:scoring/> 
    </gam:quarter> 
    <gam:quarter number="2"> 
     <gam:awayScore>3</gam:awayScore> 
     <gam:homeScore>10</gam:homeScore> 
     <gam:scoring> 
      <gam:scoringPlay> 
       <gam:time>7:46</gam:time> 
       <gam:teamAbbreviation>SEA</gam:teamAbbreviation> 
       <gam:playDescription>(7:14) R.Wilson pass short right to P.Richardson for 2 yards, TOUCHDOWN. Penalty on DET-T.Wilson, Defensive Pass Interference, declined.</gam:playDescription> 
      </gam:scoringPlay> 
     </gam:scoring> 
    </gam:quarter> 
    </gam:quarterSummary> 
<gam:gameboxscore 

ここは私のXSLTコードです。私はXMLファイルからCSVを作成しようとしています。これはCSVを作成しますが、定義された列ヘッダーと実際のデータはありません。

<xsl:stylesheet version="2.0" xmlns:gam="http://leaguemanager.beacontender.com/plugin/feed/sport/usftbl/gameboxscore" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/> 
<xsl:template match="/"> 
    <xsl:text<GameDate;AwayTeam;HomeTeam;ScoringTeam;playDescription</xsl:text> 
    <xsl:text>&#13;&#10;</xsl:text> 
<xsl:for-each select="/gam:gameboxscore"> 
    <xsl:text>"</xsl:text> 
    <xsl:value-of select="../gam:game/gam:date"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:value-of select="../gam:game/gam:awayteam/gam:Abbreviation"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:value-of select="../gam:game/gam:hometeam/gam:Abbreviation"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:value-of select="../gam:quartersummary/gam:quarter/gam:scoring/gam:scoringplay/gam:teamabbreviation"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:value-of select="../gam:quartersummary/gam:quarter/gam:scoring/gam:scoringplay/gam:teamabbreviation"/> 
    <xsl:text>"</xsl:text> 
    <xsl:text>&#13;&#10;</xsl:text> 
</xsl:for-each> 

</xsl:template> 
</xsl:stylesheet> 
+1

あなたのXMLとXSLTの両方が構文エラーを持っています。 XMLの最後の行は ''タグでなければならず、XSLTではヘッダーを出力する行が悪いです。これをあなたの実際のファイルからコピー/ペーストしましたか、それとも再入力しましたか?再入力した場合は、投稿を編集して_acutal_ XMLとXSLTにコピー&ペーストしてください。構文上の問題以外にも別の問題があります。あなたのXSLTは、複数の ''セクションを持つことを想定していますが、そのタグがルートであり、ルートが1つしかないことはできません。解決策は簡単ですが、実際のXMLとXSLTを投稿する必要があります。 –

+0

ところで、私のコメントは個人的には取らないでください。あなたは実際に非常に良い最初の質問を投稿しました。私はあなたが実際に達成しようとしていることを理解するとすぐに答えを得たいと思っています。 –

+0

実際、必要に応じて、結果は1行csvになります。 XMLには多くの ''ノードがあると思います。 – Parfait

答えて

0

構文エラーには2種類あります。私は例としてこれを見てみましょう:あなたは gam:gameboxscoreのコンテキストにあるので、これは、動作しないことができる

<xsl:value-of select="../gam:game/gam:awayteam/gam:Abbreviation"/> 
  1. - とgam:game gam:gameboxscoreの親ではありません(..ステップは、の略ですparent::node())。あなたは利用したい :

    <xsl:value-of select="./gam:game/gam:awayteam/gam:Abbreviation"/> 
    

    または単に:

    <xsl:value-of select="gam:game/gam:awayteam/gam:Abbreviation"/> 
    

    最初のロケーションステップとしてgam:gameを選択します。

  2. XMLは大文字と小文字を区別します。gam:awayteamは、 gam:awayTeamを選択しません。

さて、あなたがしようとした場合:

<xsl:value-of select="gam:game/gam:awayTeam/gam:Abbreviation"/> 

あなたは実際の値を取得します。それに応じて残りのselect式を修正してください。


P.S.私はあなたの入力の構造、またはあなたの出力の構造を理解していませんでした。ゲームは1つしかありませんか?そして1つの得点だけがプレーされますか?ご希望の場合は、

<xsl:template match="/gam:gameboxscore"> 
    <xsl:text>GameDate;AwayTeam;HomeTeam;ScoringTeam;playDescription&#13;&#10;"</xsl:text> 
    <xsl:value-of select="gam:game/gam:date"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:value-of select="gam:game/gam:awayTeam/gam:Abbreviation"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:value-of select="gam:game/gam:homeTeam/gam:Abbreviation"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:value-of select="gam:quarterSummary/gam:quarter/gam:scoring/gam:scoringPlay/gam:teamAbbreviation"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:value-of select="gam:quarterSummary/gam:quarter/gam:scoring/gam:scoringPlay/gam:playDescription"/> 
    <xsl:text>"</xsl:text> 
    <xsl:text>&#13;&#10;</xsl:text> 
</xsl:template> 

か::もしそうなら、あなたはこれを短縮することができ

<xsl:template match="/gam:gameboxscore"> 
    <xsl:text>GameDate;AwayTeam;HomeTeam;ScoringTeam;playDescription&#13;&#10;"</xsl:text> 
    <xsl:variable name="game" select="gam:game" /> 
    <xsl:value-of select="$game/gam:date"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:value-of select="$game/gam:awayTeam/gam:Abbreviation"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:value-of select="$game/gam:homeTeam/gam:Abbreviation"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:variable name="scoring-play" select="gam:quarterSummary/gam:quarter/gam:scoring/gam:scoringPlay" /> 
    <xsl:value-of select="$scoring-play/gam:teamAbbreviation"/> 
    <xsl:text>";"</xsl:text> 
    <xsl:value-of select="$scoring-play/gam:playDescription"/> 
    <xsl:text>"</xsl:text> 
    <xsl:text>&#13;&#10;</xsl:text> 
</xsl:template> 
+0

アドバイスをいただきありがとうございます。あなたが私に与えた出力は、最初のスコアリング・プレイ(これは私がXMLサンプルに含まれている唯一のものであって意味がある)を返しています。私が本当に必要としているのは、発生した各スコアリングをつかむことです。 1四半期に0得点があり、1四半期に多くの得点を挙げることができます。 GameDate、AwayTeamなどがExcelの別の列になることが、私が欲しいことです。そして、対応するデータを私はその列の下に置くことを選択しています。 入力いただきありがとうございます! –

+0

複数のスコアリングとそれに対応する期待される出力を伴う入力例を見ることなく、私はそれに答えることができません。そして私は「別のもの」を全く理解しませんでした。私は、あなたの現在の(つまり、上記のように修正された)試行で新しい質問を投稿することをお勧めします。 –

関連する問題